java - 通过 Spring 创建的 H2 服务器数据库无法访问

标签 java spring hibernate datasource h2

我使用的版本:

  • Spring 版本:4.0.5.RELEASE
  • H2 版本:1.3.174
  • hibernate 版本:4.3.6.Final

我曾经有一个工作设置,在部署 war 文件时使用我的 applicationContext 创建 H2 服务器和数据源。我的配置是这样的:

<bean id = "h2Server"
      class="org.h2.tools.Server"
      factory-method="createTcpServer"
      init-method="start"
      destroy-method="stop">
    <constructor-arg value="-tcp,-tcpAllowOthers,-tcpPort,8045" />
</bean>

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource" depends-on="h2Server">
  <property name="driverClassName" value="org.h2.Driver" />
  <property name="url" value="${database.url}" />
  <property name="username" value="${database.username}" />
  <property name="password" value="${database.password}" />

然后我定义了一个

LocalContainerEntityManagerFactoryBean

定义 jpaProperty 以使 hibernate 自动生成所有表:

<property name="jpaProperties">
    <props>
        <prop key="hibernate.hbm2ddl.auto">update</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
    </props>
</property>

这就像一个魅力,当部署我的应用程序时,所有表都会自动创建。这对于测试设置来说非常有用,但对于生产版本,我们希望关闭 hibernate 自动生成表的功能,并且我们希望自己管理 sql 创建和迁移脚本。

因此,我决定使用 Flyway 作为数据库迁移工具,并从 EntityManager 定义中删除了以下行:

 <prop key="hibernate.hbm2ddl.auto">update</prop>

这似乎有效,数据库已创建并且具有最小大小,但是当我尝试使用 Squirrel 连接到它时,出现以下异常:

squirrel screenshot

我希望如果 H2Server 和数据源 bean 是由 Spring 创建的,则可以使用它的驱动程序、url、用户名、密码来访问数据库。

我的第一个想法是,它们不是因为延迟初始化而创建的,而 hibernate 表的创建意味着 bean 被真正初始化。我尝试将这两个属性的延迟初始化属性设置为 false,但没有成功...

我一定错过了一些东西,但现在看不到...... 有没有办法在应用程序部署后使数据库可用于连接?

最佳答案

您在客户端使用的是 H2 版本 1.4.181。 (错误代码的最后一部分90067-181是H2的版本号)。

在服务器端,您写道您正在使用 H2 版本 1.3.174。

问题很可能是 H2 客户端和 H2 服务器之间不兼容。理论上,这应该不是问题,但看起来 H2 中存在一个错误,导致这些版本无法协同工作。

我建议将服务器也升级到1.3.181,并将;mv_store=false附加到数据库URL以禁用仍处于测试阶段的新存储引擎。

关于java - 通过 Spring 创建的 H2 服务器数据库无法访问,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26723872/

相关文章:

java - 如何删除java中第一个和最后一个出现的句子

java - 在 Spring 中使用 JPA 规范获取要执行的查询

javascript - 如何停止重新加载 JavaScript

java - Mule ESB 在 Callable 类之外读取 @Value 属性

java - 白标签错误页面此应用程序没有配置错误 View ,因此您将其视为后备

java - Spring JPA 不检测已删除的表

java - 在实体类的多个字段上使用 HQL select 语句将 java.lang.object 转换为自定义对象的最佳方法

java - 如何使用子查询而不是连接查询来通过 hibernate 获得正确的计数

java - 由于@Constraint validatedBy,如何避免层之间的交叉依赖?

java - 将环境变量解析为 JNLP 文件中的参数