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

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 执行既不更新/删除也不返回结果的本机查询?


慕桂英4014372
浏览 112回答 1
1回答

Qyouu

使用底层 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'")    );}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java