簡體   English   中英

休眠:清理會話

[英]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.

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