版本:
我曾经有一个工作设置,我在部署war文件时使用applicationContext创建H2服务器和dataSource。我的配置是这样的:
<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,但没有运气......
我一定错过了什么,但现在还不能看到它...... 部署应用程序后,有没有办法使数据库可用于连接?
答案 0 :(得分:1)
您在客户端使用H2版本1.4.181。 (错误代码的最后一部分,90067-181,是H2的内部编号)。
在服务器端,您写道您正在使用H2版本1.3.174。
问题很可能是H2客户端和H2服务器之间不兼容。从理论上讲,这不应该是一个问题,但看起来H2中存在一个错误,阻止这些版本一起工作。
我建议将服务器升级到1.3.181,并将;mv_store=false
附加到数据库URL以禁用仍处于测试阶段的新存储引擎。
答案 1 :(得分:0)
我找到了解决方案:一切正常。我在org.h2.tools.Server类的启动和停止方法中放置了一个断点,并在将应用程序部署到我的tomcat服务器时激活了远程调试。
我注意到服务器启动了,但是过了一段时间,我也到了stop方法。更深入的调查向我展示了tomcat命令中的以下几行:
04-Nov-2014 13:00:28.240 SEVERE [localhost-startStop-1] org.apache.catalina.core
.StandardContext.startInternal Error listenerStart
04-Nov-2014 13:00:55.961 SEVERE [localhost-startStop-1] org.apache.catalina.core
.StandardContext.startInternal Context [/healthdata_hd4res] startup failed due to previous errors
然后在localhost.log文件中,我发现以下错误:
Caused by: org.h2.jdbc.JdbcSQLException: Table "CONFIGURATIONS" not found; SQL statement:
select configurat0_.CONFIGURATION_ID as CONFIGUR1_1_, configurat0_.DESCRIPTION as DESCRIPT2_1_, configurat0_.KEY as KEY3_1_, configurat0_.UPDATED_ON as UPDATED_4_1_, configurat0_.VALID_FROM as VALID_FR5_1_, configurat0_.VALID_TILL as VALID_TI6_1_, configurat0_.VALUE as VALUE7_1_ from CONFIGURATIONS configurat0_ where configurat0_.KEY=? and (configurat0_.VALID_FROM is null or configurat0_.VALID_FROM<=?) and (configurat0_.VALID_TILL is null or configurat0_.VALID_TILL>=?) [42102-174]
at org.h2.message.DbException.getJdbcSQLException(DbException.java:332)
at org.h2.message.DbException.get(DbException.java:172)
有两个类实现了ServletContextListener以将数据注入现有表。由于尚未创建表,因此在部署期间生成了错误并且我的h2Server已关闭...