我在tcp /多用户模式下运行带有H2数据库的Glassfish 4.1服务器。我试图以编程方式更新单例bean中的表。我总是得到以下例外:
org.h2.jdbc.JdbcSQLException: Timeout trying to lock table "GLOBALS"; SQL statement: ALTER TABLE "PUBLIC".GLOBALS ADD STARTFLAG VARCHAR(512) [50200-176]
我知道该表已被锁定,因为其中一个容器管理的实体管理器似乎在该表上具有开放连接。但是在alter table语句时,不需要任何连接...
因此我想知道是否有可能使用容器管理的JPA关闭所有jdbc连接?
这是我用来启动/连接到H2数据库的初始化字符串:
jdbc:h2:tcp://localhost/~/datastore/database;AUTO_SERVER=TRUE;MVCC=TRUE
我已经尝试关闭容器管理的实体管理器和 实体经理工厂(但我认为这不是正确的方法, 因为它是在更新语句之前由容器处理的 执行。
我试图在更新语句之前分离托管对象 执行。
我尝试添加MVCC = TRUE选项(多版本并发)。
还尝试设置FILE_LOCK = NO,但后来我又得到另一个异常,告诉我这个选项组合无效。
但到目前为止没有成功......
任何想法都非常感谢 - 提前感谢!
答案 0 :(得分:1)
我想到的解决方案是关闭服务器并再次重新打开连接。
如果您使用的是java配置,则可以使用server.stop()
import org.h2.tools.Server;
...
// start the TCP Server
Server server = Server.createTcpServer(args).start();
...
// stop the TCP Server
server.stop();
如果您是通过您的网址创建数据库。您可以创建一个bat文件,并从您的应用程序以编程方式调用它。
java org.h2.tools.Server -tcpShutdown tcp://localhost:9092
您可以从H2 Website
中找到更多信息