【发布时间】:2014-03-18 20:17:57
【问题描述】:
也许标题是不言自明的,但我正在尝试使用 H2 数据库的嵌入式实例创建一个 Web 应用程序。我将 Tomcat 7 配置为使用 JDBC 领域进行基于表单的身份验证。 server.xml 有:
<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".
我的网络应用程序无法启动。
启动 H2 TCP 服务器并将 JDBC URL 替换为 jdbc:h2:tcp://myIP/ 工作正常。所以我的数据库文件没有问题。另外,我确信没有其他人试图使用这些文件。所以冲突只能发生在 JDBC 领域和 Hibernate 之间。
为什么需要嵌入式服务器?出于经典原因:我想分发此应用程序,并且我不希望用户必须启动两个进程而不仅仅是一个进程。此外,这不是共享数据库,因此无需为此创建新进程。最后,没有为数据库打开额外的服务器端口,这有利于安全。
【问题讨论】:
-
不是重复的。发生的事情是一样的,但它是 Tomcat JDBC 领域和 Hibernate 之间的不兼容。导致问题的不是我的代码,因此该问题不适用于此处。
标签: java hibernate tomcat jdbc h2