簡體   English   中英

在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:執行更新/刪除查詢

它不是更新或刪除,但是executeUpdate()是可以調用以執行此語句而不返回任何行的唯一方法。 由於會話變量適用於整個連接,因此它不必處於事務中,並且由於連接池正在使用中,因此必須執行該操作以還原會話變量。

我嘗試使用一種查詢方法代替,但是該語句有-1行,並且不會讓我在最后堆疊SELECT 1 FROM DUAL

有沒有什么辦法可以從Hibernate中執行既不在事務之外也不進行更新/刪除或返回結果的本地查詢呢?

使用基礎連接直接繞過了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'")
    );
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM