如何断开 Glassfish 上的所有 JDBC 连接并解锁 H2 数据库



我正在运行一台 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网站找到更多信息

相关内容

  • 没有找到相关文章

最新更新