【发布时间】:2015-02-27 04:49:41
【问题描述】:
我正在尝试将我们的代码库从 Hibernate 3.6 升级到 4.0(只是让我们更新的第一步)。我遇到了一个问题,即使我们在确保事务为 isActive() 后调用了 commit(),也没有发出 COMMIT。
当对 Postgres 数据库成功运行一些查询时,我在 Postgres 日志中看到了这一点:
2014-12-30 20:09:39 CST LOG: execute <unnamed>: SET extra_float_digits=3
2014-12-30 20:09:39 CST LOG: execute S_1: BEGIN
2014-12-30 20:09:39 CST LOG: execute <unnamed>: -- This script........
注意那里的 BEGIN,然后这里是一个简单的提交调用示例:
if (sf.getCurrentSession().getTransaction().isActive()) {
sf.getCurrentSession().getTransaction().commit();
}
我已经调试到 AbstractTransactionImpl 并且正在查看 Jdbc4Connection commit() 方法,并看到实际的 COMMIT 调用被跳过......但我不知道为什么。这是失败的 if 语句(它在 AbstractJdbc2Connection 中)。
if (protoConnection.getTransactionState() != ProtocolConnection.TRANSACTION_IDLE)
executeTransactionCommand(commitQuery);
所以,显然我们的事务状态是 == ProtocolConnection.TRANSACTION_IDLE。但是,我不完全确定这意味着什么,为什么当事务说 isActive() 时我们会遇到这个问题?
注意:同样的代码在 Hibernate 3.6 上也适用于我们。
谢谢。
更新:我进一步调试,看起来有许多 ProtocoalConnectionImpl 对象正在构建,这是否表明我们的软件方面存在问题,正在做不应该做的事情?就像这是否表明我们正在打开只是闲逛的连接?感谢您提供更多见解。
【问题讨论】:
标签: java hibernate jdbc postgresql-9.1