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

Alter Oracle session variables outside of a Hibernate transaction

出于性能原因,我们使用这样的模式已经有一段时间了,以确保使用 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: Executing an update/delete query

它不是更新或删除,但 executeUpdate() 是您可以调用以执行此语句而不返回任何行的唯一方法。它不需要在事务中,因为会话变量适用于整个连接,并且确实需要执行它来恢复会话变量,因为连接池正在使用中。

我试过使用其中一种查询方法,但是这个语句有 -1 行,它不会让我在最后堆叠 SELECT 1 FROM DUAL

有没有什么方法可以在事务之外从 Hibernate 执行既不 update/delete 也不返回结果的本机查询?

使用底层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'")
    );
}