在 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'")
);
}
出于性能原因,我们使用这样的模式已经有一段时间了,以确保使用 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'")
);
}