簡體   English   中英

Grails和休眠會話,異常時保存到數據庫

[英]Grails and hibernate session, save to database on exception

我正在使用Grails框架。

想要在失敗時將某些內容保存到數據庫中(引發RuntimeException之后)。 假設我在一種事務服務中有這樣的東西:

try {
   throw new RuntimeException()
} catch(Exception ex) {
   new FatalErrorDomainObject().save()
}

當前版本將失敗,因為會話設置為回滾。

我試圖以多種方式解決此問題,到目前為止,我發現的是:

.withTransaction無效,因為它將事務綁定到當前會話

.withSession將不起作用,因為它將僅重用現有會話

.withNewSession單獨將不起作用,因為它將在同一線程中創建新會話(同一線程=相同的數據庫連接,因此它將因SQL異常而失敗)

到目前為止,我發現的唯一可行的解​​決方案是創建新線程和新的休眠會話。 這真的是唯一(正確的)方法嗎?

public static void syncSession(Closure job) {
    // Checking environment in production code it's not very elegant but thanks to this it's transparent
    // for all tests and makes them DRY.
    if(Environment.current == Environment.TEST) {
        job.call()
    }
    Thread t = new Thread({
        DomainObject.withNewSession {
            job.call()
        }
    })
    t.start()
    t.join()
}

用法:

try {
   throw new RuntimeException()
} catch(Exception ex) {
   syncSession {
      new FatalErrorDomainObject().save()
   }
}

我認為您的解決方案更好,但是我仍然想給您這個建議:在其余邏輯之前在單獨的事務中調用new FatalErrorDomainObject().save() ,並在提交結束之前在邏輯末尾刪除FatalErrorDomainObject。 像這樣:

def fatalError = new FatalErrorDomainObject()
FatalErrorDomainObject.withTransaction { status ->
    fatalError.save()
}
doSomethingThatMightThrowRuntimeException()
FatalErrorDomainObject.get(fatalError.id).delete()

暫無
暫無

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

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