2014-11-03 94 views
0

版本我用:H2服務器DB通過創建春季無法訪問

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

我曾經有一個工作設置,當我部署一個war文件時,使用我的applicationContext創建一個H2服務器和一個dataSource。我的配置是這樣的:

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

此作品:

<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}" /> 

然後,我定義爲讓Hibernate自動生成所有表的jpaProperty定義的

LocalContainerEntityManagerFactoryBean 

就像一個魅力,當我的應用程序部署時,所有的表都被創建爲automa的角度講。這對測試設置非常有用,但對於產品發佈,我們希望通過hibernate關閉自動生成表,並且我們希望自己管理sql創建和遷移腳本。

因此我決定用飛行用的數據庫遷移工具和我刪除從EntityManager的定義如下一行:

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

這似乎是工作和數據庫中創建並具有最小的尺寸,但是當我嘗試連接它使用的松鼠,我得到以下異常:

squirrel screenshot

我希望,如果H2Server和數據源豆由Spring創建,數據庫訪問是使用它的驅動程序,網址,用戶名,密碼。

我的第一個想法是,它們不是由於惰性初始化而創建的,而hibernate表創建意味着要真正初始化bean。我試圖將延遲初始化的屬性設置爲false,但是沒有運氣...

我必須缺少一些東西,但目前看不到它... 有沒有辦法讓一旦部署應用程序,數據庫可用於連接?

回答

0

我發現解決方案:一切工作正常。我在org.h2.tools.Server類的start和stop方法中放置了一個斷點,並在將應用程序部署到我的tomcat服務器時激活了遠程調試。

我注意到服務器啓動了,但是一段時間後,我也到了停止方法。更深層次的調查顯示,我在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) 

有2類,實現了一個的ServletContextListener注入數據進入現有的表格。由於表尚未創建,錯誤已生成,並且我的h2Server在部署過程中被關閉...

+0

好的。這並不能解釋你看到的異常(發佈在問題中),但如果它現在可以工作,那麼我猜問題解決了:-) – 2014-11-04 15:14:56

1

您在客戶端使用H2版本1.4.181。 (錯誤代碼的最後一部分,90067-181,是H2的內部版本號)。

在服務器端,你寫的是使用H2版本1.3.174。

問題很可能是H2客戶端和H2服務器之間的不兼容。從理論上講,它不應該是一個問題,但它看起來像H2中有一個錯誤,它會阻止這些版本一起工作。

我建議將服務器升級到1.3.181,並在數據庫URL中附加;mv_store=false以禁用尚處於測試階段的新存儲引擎。

+0

感謝您的回覆。我嘗試了您的解決方案,但不幸的是沒有運氣......我無法在使用Java代碼部署後立即連接到數據庫,所以我認爲它真的不可用,並且在我的彈簧配置中存在錯誤... – 2014-11-04 10:16:39

相關問題