Jpa 如何断开Glassfish上的所有JDBC连接并解锁H2数据库?
我正在运行一个Glassfish 4.1服务器,其中包含一个tcp/多用户模式下的H2数据库。我试图以编程方式更新单例bean中的表。我总是会遇到以下例外情况:Jpa 如何断开Glassfish上的所有JDBC连接并解锁H2数据库?,jpa,jdbc,glassfish,h2,aero-glass,Jpa,Jdbc,Glassfish,H2,Aero Glass,我正在运行一个Glassfish 4.1服务器,其中包含一个tcp/多用户模式下的H2数据库。我试图以编程方式更新单例bean中的表。我总是会遇到以下例外情况: org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "GLOBALS"; SQL statement: ALTER TABLE "PUBLIC".GLOBALS ADD STARTFLAG VARCHAR(512) [50200-176] 我知道该表被锁定,因为其中一个
org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "GLOBALS"; SQL statement: ALTER TABLE "PUBLIC".GLOBALS ADD STARTFLAG VARCHAR(512) [50200-176]
我知道该表被锁定,因为其中一个容器管理的实体管理器似乎在该表上有一个打开的连接。但是在ALTERTABLE语句时,不需要任何连接
因此,我想知道是否有可能使用容器管理的JPA关闭所有jdbc连接
下面是我用来启动/连接H2数据库的初始化字符串:
jdbc:h2:tcp://localhost/~/datastore/database;AUTO_SERVER=TRUE;MVCC=TRUE
- 我已经尝试关闭容器管理的实体管理器和 实体经理工厂(但我认为这不是正确的方法, 因为它是由容器处理的),所以在更新语句之前 执行
- 我试图在update语句之前分离托管对象 他们被处决了
- 我尝试添加MVCC=TRUE选项(多版本并发)
- 还尝试设置FILE_LOCK=NO,但随后我得到另一个异常,它告诉我此选项组合无效
高度赞赏任何想法-提前感谢 我想到的解决方案是关闭服务器并重新打开连接 如果您使用的是java配置,那么可以使用server.stop() 如果您正在通过URL创建db。您可以创建一个bat文件,并从应用程序中以编程方式调用它
java org.h2.tools.Server -tcpShutdown tcp://localhost:9092
您可以从什么是连接字符串中找到更多信息?你把DB_CLOSE_设置在退出位置了吗?@Ali:谢谢你的回复。不,到目前为止我还没有,但是这对我的问题有什么帮助呢?我用连接字符串扩展了我的问题……不幸的是,我在glassfish应用服务器上使用容器管理的jpa。因此,容器本身控制h2服务器和jdbc连接的生命周期。无论如何,谢谢你的主意。
java org.h2.tools.Server -tcpShutdown tcp://localhost:9092