我使用的版本:
- 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 连接到它时,出现以下异常:
我希望如果 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/