[英]Grails runtime exception: Could not open Hibernate session for transaction
[英]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.