通过Spring创建的java H2服务器数据库不可访问
我使用的版本:
- Spring版本:4.0.5。释放
- H2版本:1.3.174
- 休眠版本:4.3.6。决赛
我曾经有一个工作设置,在部署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
定义了JPAPProperty以使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作为DB迁移工具,并从EntityManager定义中删除了以下行:
<prop key="hibernate.hbm2ddl.auto">update</prop>
这似乎是可行的,数据库已创建且大小最小,但当我尝试使用Squirrel连接到它时,会出现以下异常:
我希望如果H2Server和DataSourcebean是由Spring创建的,那么可以使用驱动程序、url、用户名和密码访问DB
我的第一个想法是,它们不是因为延迟初始化而创建的,而hibernate表的创建意味着bean要真正初始化。我尝试为这两个属性将惰性初始化的属性设置为false,但没有成功
我一定错过了什么,但现在还看不见。。。 部署应用程序后,是否有方法使数据库可用于连接
# 1 楼答案
我找到了解决办法:一切正常。我在组织的start和stop方法中设置了一个断点。h2。工具。将应用程序部署到我的tomcat服务器时,服务器类并激活了远程调试
我注意到服务器启动了,但过了一段时间,我也使用了stop方法。更深入的调查向我展示了tomcat命令中的以下几行:
然后在本地主机中。在日志文件中,我发现以下错误:
有两个类实现了ServletContextListener,将数据注入现有表。由于尚未创建表,因此生成了错误,并且我的服务器在部署期间关闭
# 2 楼答案
您正在客户端使用H2版本1.4.181。(错误代码的最后一部分90067-181是H2的内部版本号)
在服务器端,您写道您正在使用H2版本1.3.174
问题很可能是H2客户端和H2服务器之间不兼容。从理论上讲,这不应该是个问题,但H2中似乎存在一个缺陷,阻止了这些版本一起工作
我建议也将服务器升级到1.3.181,并将
;mv_store=false
附加到数据库URL以禁用仍处于测试阶段的新存储引擎