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

Posted

技术标签:

【中文标题】如何断开 Glassfish 上的所有 JDBC 连接并解锁 H2 数据库?【英文标题】:How to disconnect all JDBC connections on Glassfish and unlock H2 database? 【发布时间】:2015-01-08 19:30:28 【问题描述】:

我在 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,但随后出现另一个异常,告诉我此选项组合无效。

但到目前为止没有成功...

任何想法都非常感谢 - 在此先感谢!

【问题讨论】:

你的连接字符串是什么?你设置 DB_CLOSE_ON_EXIT 了吗? @Ali:感谢您的回复。不,到目前为止我还没有,但这对我的问题有什么帮助?我用连接字符串扩展了我的问题... 【参考方案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();

如果您通过 URL 创建数据库。您可以创建一个 bat 文件并从您的应用程序中以编程方式调用它。

java org.h2.tools.Server -tcpShutdown tcp://localhost:9092

您可以从H2 Website找到更多信息

【讨论】:

不幸的是,我在 glassfish 应用服务器上使用容器管理的 jpa。因此容器本身控制着 h2-server 和 jdbc 连接的生命周期。无论如何,谢谢你的想法。

以上是关于如何断开 Glassfish 上的所有 JDBC 连接并解锁 H2 数据库?的主要内容,如果未能解决你的问题,请参考以下文章

连接断开原因

配置 GlassFish JDBC 连接池以处理 Amazon RDS 多可用区故障转移

Mysql/Glassfish 资源 jdbc 无效

GlassFish 3.1.1 - 获取 jdbc 连接

Glassfish中的JDBC连接池ping错误

glassfish 3.1.2 - ResultSetWrapper40 无法转换为 oracle.jdbc.OracleResultSet