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'")
);
}
添加回答
举报
0/150
提交
取消