2014-03-18 80 views
0

「另一個進程鎖定」也許稱號,是自我解釋,但我想創建與H2數據庫的嵌入式實例的Web應用程序。我正在配置Tomcat 7以使用JDBC領域進行基於表單的身份驗證。 server.xml有:嵌入式H2 + Tomcat的7 JDBC領域+ Hibernate的=

<Realm className="org.apache.catalina.realm.JDBCRealm" 
driverName="org.h2.Driver" 
connectionURL="jdbc:h2:/someDir/myDB" 
connectionName="userName" 
connectionPassword="password" 
userTable="user_enabled" 
userNameCol="user_name" 
userCredCol="pass" 
userRoleTable="user_role" 
roleNameCol="role_name" /> 

我也使用Hibernate進行持久化。 persistence.xml有:

<property name="hibernate.connection.driver_class" value="org.h2.Driver" /> 
<property name="hibernate.connection.url" value="jdbc:h2:/someDir/myDB" /> 
<property name="hibernate.connection.username" value="userName" /> 
<property name="hibernate.connection.password" value="password" /> 
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" /> 
<property name="hibernate.hbm2ddl.auto" value="validate" /> 
<property name="hibernate.show_sql" value="true" /> 
<property name="current_session_context_class" value="org.hibernate.context.internal.ThreadLocalSessionContext" /> 

如果我嘗試啓動我得到的服務器:

(...) Caused by: org.h2.jdbc.JdbcSQLException: Database may be already in use: "Locked by another process". 

我的web應用程序無法啓動。

啓動一個H2 TCP服務器,並與jdbc:h2:tcp://myIP/更換JDBC的URL工作正常。所以我的數據庫文件沒有問題。另外,我確定沒有其他人試圖使用這些文件。所以衝突只能在JDBC領域和Hibernate之間進行。

爲什麼我想要一個嵌入式服務器?出於經典原因:我想分發這個應用程序,我不希望用戶必須啓動兩個進程而不是一個進程。此外,這不會是一個共享數據庫,所以不需要爲此創建新的進程。最後,沒有額外的服務器端口爲數據庫打開,這對安全性有好處。

+0

的可能的複製[H2數據庫錯誤:數據庫可能已經在使用中:「另一個進程鎖定」(https://stackoverflow.com/questions/ 8158969/H2-數據庫錯誤數據庫可待已經在使用的鎖定逐另一處理)。 –

+0

它不是重複的。發生的事情是一樣的,但它是Tomcat JDBC領域和Hibernate之間的不兼容。這不是我的代碼造成問題的原因,因此這個問題在這裏不適用。 – Akira

回答

0

回答我的問題,使這項工作的方法是使用一個JNDI數據源訪問數據庫。對於身份驗證,應將Tomcat配置爲使用DataSourceRealm。因此,Tomcat安全性和Hibernate都將使用H2的相同嵌入式實例,這不會導致我遇到的衝突。

0

雖然JNDI數據源是優選的,原來的問題是,你要創建使用文件或嵌入式數據庫的URL兩個連接到同一個數據庫H2。 H2確實支持這一點,但是這兩個進程都需要在連接url中添加「; AUTO_SERVER = true」。這會導致第一個連接在嵌入模式下啓動數據庫進程,但允許第二個連接通過tcp ip進行連接。

詳情請訪問:

http://www.h2database.com/html/features.html#auto_mixed_mode

+0

感謝您的留言。 是的,這是一種可能性,但我試圖避免這種可能性。有一個嵌入式DB創建一個服務器套接字,在同一個JVM上的其他進程必須連接到這個套接字上有點奇怪。不僅這可能性能較差,而且不必要地打開一個TCP端口,這可能是一個安全問題,並與端口的其他進程競爭。 AUTO_SERVER是偉大的,但我想這是一個適合其他用途的情況下的特性。 – Akira