我正在运行一台 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]
我知道该表已锁定,因为容器管理的实体管理器之一似乎在该表上具有打开的连接。但是在更改表语句时,不需要任何连接...
因此,我想知道是否有可能使用容器管理的 JPA 关闭所有 jdbc 连接?
这是我用来启动/连接到 H2 数据库的初始化字符串:
jdbc:h2:tcp://localhost/~/datastore/database;AUTO_SERVER=TRUE;MVCC=TRUE
我已经尝试关闭容器管理的实体管理器和实体管理器工厂(但我认为这不是正确的方法,因为它由容器处理)在更新语句之前执行。
我试图在更新语句之前分离托管对象被执行。
我尝试添加MVCC=TRUE选项(多版本并发)。
还尝试设置 FILE_LOCK=NO,但随后我得到另一个异常,告诉我这种选项组合无效。
但到目前为止还没有成功...
任何想法都高度赞赏 - 提前感谢!
到的解决方案是关闭服务器并再次重新打开连接。
如果您使用的是 java 配置,则可以使用 server.stop()
import org.h2.tools.Server;
...
// start the TCP Server
Server server = Server.createTcpServer(args).start();
...
// stop the TCP Server
server.stop();
如果您通过 URL 创建数据库。您可以创建一个 bat 文件,并从应用程序以编程方式调用它。
java org.h2.tools.Server -tcpShutdown tcp://localhost:9092
您可以从H2网站找到更多信息