2014-03-18 34 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