为了账号安全,请及时绑定邮箱和手机立即绑定

在 Hibernate 事务之外更改 Oracle 会话变量

在 Hibernate 事务之外更改 Oracle 会话变量

慕桂英4014372 2022-06-15 16:41:08
BATCH NOWAIT出于性能原因,我们一直在使用这样的模式来确保使用 执行特定操作。try {    session.createSQLQuery("ALTER SESSION SET COMMIT_LOGGING='BATCH' COMMIT_WAIT='NOWAIT'").executeUpdate();    // Do the operation (which also calls transaction.commit())    return callback.apply(session);} finally {    session.createSQLQuery("ALTER SESSION SET COMMIT_LOGGING='IMMEDIATE' COMMIT_WAIT='WAIT'").executeUpdate();}这在 Hibernate 4 中运行良好。从 Hibernate 5 开始,最后一条语句失败,因为它不在事务中(因为它刚刚被提交)。javax.persistence.TransactionRequiredException:执行更新/删除查询它不是更新或删除,而是executeUpdate()您可以调用以执行此语句而不返回任何行的唯一方法。它不需要在事务中,因为会话变量适用于整个连接,并且确实需要执行以恢复会话变量,因为正在使用连接池。我已经尝试使用其中一种查询方法,但是这个语句有 -1 行,它不会让我SELECT 1 FROM DUAL最后堆叠。有没有办法在事务之外从 Hibernate 执行既不更新/删除也不返回结果的本机查询?
查看完整描述

1 回答

?
Qyouu

TA贡献1786条经验 获得超11个赞

使用底层 Connection 直接绕过了 Hibernate 的检查,让我可以安心地执行这样的语句。


try {

    session.doWork(conn ->

            conn.createStatement().execute("ALTER SESSION SET COMMIT_LOGGING='BATCH' COMMIT_WAIT='NOWAIT'")

    );

    return callback.apply(session);

} finally {

    session.doWork(conn ->

            conn.createStatement().execute("ALTER SESSION SET COMMIT_LOGGING='IMMEDIATE' COMMIT_WAIT='WAIT'")

    );

}


查看完整回答
反对 回复 2022-06-15
  • 1 回答
  • 0 关注
  • 109 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信