【问题标题】:Hibernate 4 upgrade, COMMIT not being issuedHibernate 4升级,未发出COMMIT
【发布时间】: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


    【解决方案1】:

    原来我做错了什么(惊讶)。 TransactionState 显示为 TRANSACTION_IDLE 并且没有发出提交是有充分理由的。

    我在 internetz 上的多个地方看到人们通过访问底层 ConnectionProvider 来访问新的 Hibernate 4.x 土地中的 JDBC 连接(有点像这样:https://stackoverflow.com/a/21271019/115694)。

    但是,这样做的问题是您获得了一个全新的连接......而不是与 当前 会话关联的连接。这是一个很大的禁忌,或者至少对我们来说是这样。

    实际上,您确实必须按照该人在此答案中所说的去做: https://stackoverflow.com/a/3526626/115694

    基本上,您必须使用 Work API。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-21
      • 2012-01-29
      • 2022-08-22
      • 1970-01-01
      • 2022-01-10
      • 2010-12-10
      相关资源
      最近更新 更多