[英]Hibernate: cleaning up sessions
假設我有以下內容:
public class DAOFactory {
@Inject private final SessionFactory factory;
private final ThreadLocal<Session> session = new ThreadLocal<>();
// In a nutshell: create an AbstractDAO associated with the session object held by the ThreadLocal above
public <T> AbstractDAO<T> createObject(Class<T> objectClass) { ... }
}
我的問題是這些會話需要關閉,只有從createObject()
創建DAO的線程才能執行此操作。 顯然, AbstractDAO
不能具有關閉例程,因為同一Session
可以與多個AbstractDAO
對象關聯,因此DAOFactory
必須承擔關閉會話的負擔。 盡管如此,仍有懸掛Session
的風險:如果創建AbstractDAO
的線程不再存在,如何關閉關聯的Session
?
我擁有的一種方法是采用如下的清理方法:
public class DAOFactory {
// createObject() uses Thread.getCurrentThread.getId() and sessionMap.computeIfAbsent()
private final ConcurrentMap<Long, Session> sessionMap = new ConcurrentHashMap<>();
public void cleanup() {
for (Session session : sessionMap.values()) {
session.close();
}
sessionMap.clear();
}
}
問題是“這種方法有多安全”,“這是一個好主意”和“應該這樣做”嗎? 如果沒有,有什么好的選擇?
請注意, DAOFactory
在創建時主要考慮了某種測試情況:一個線程開始測試運行並創建一個DAOFactory
,並且它可能會產生使用它的其他線程。 創建DAOFactory
的線程將始終比其產生的任何線程DAOFactory
,並且始終是在測試結束時調用cleanup()
線程。
手動會話管理不是一個好主意。 Hibernate已經提供了SPI,因此您不必自己做。
我建議您開始使用Spring事務管理,該事務管理還提供自動會話管理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.