2017-04-04 151 views
0

我正在使用動態Web項目。服務器啓動時我打開會話。我爲此使用了一個單獨的靜態類,並在各處使用該會話。何時關閉休眠會話?

但我不確定何時關閉會話。你知道它可以在哪裏處理?最佳做法是什麼?

回答

1

有兩個對象在Hibernate中:

Short Answer : 
SessionFactory : Heavy Weight. 
Session : light weight. 

龍答:

的SessionFactory負責創建與數據庫的連接和管理其他的東西,所以創建SessionFactory開始耗時的任務。 所以我會說只有一個sessionFactory對象應該爲每個應用程序創建,或者更好的方式是每個數據庫一個SeesionFactory。

現在來到您的會話中,它是輕量級對象,對於每個事務您都可以創建會話對象,當您完成事務時,您可以關閉會話。

0

事務關閉時應關閉Hibernate會話。每個請求一個會話是最好的方法。 Session是不是線程安全的

1

只要你想連接到你的數據庫,你應該保持你的會話。

會話不是線程安全對象,不能由多個線程共享。所以你應該爲每個請求使用一個會話。

因此,最重要的是,如果您使用的是單線程應用程序,那麼最好爲整個應用程序使用一個會話。您可以使用SessionFactory.getCurrentSession()

但是,如果您的應用程序在多個線程中共享,那麼您應該始終使用SessionFactory.openSession()打開新會話。雖然這比前者慢,但它是線程安全的。

你知道在哪裏可以把它處理

最好的做法是關閉它們在finally塊。但是,如果您使用的是Java SE 7及更高版本,那麼您也可以在try-with-resources中處理它們。

+0

Java SE 7及更高版本中的@ScaryWombat –

0

您可以配置休眠以自動打開和關閉會話,並且不需要手動關閉。如果你要打開和手動關閉,打開你的會話,執行查詢並關閉會話:

Transaction tx = session.beginTransaction(); 
    try { 
     for (int i = 0; i < mesages.size(); i++) { 
      Message message = messages.get(i); 
      session.save(message); 
      if (i % 75 == 0) { 
       // flush a batch of inserts and release memory: 
       session.flush(); 
       session.clear(); 
      } 
     } 
     tx.commit(); 
    }catch (Exception e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
     tx.rollBack(); 
    }finally{ 
     session.close(); 
    } 
} 

上面的代碼的問題鏈接:How to properly close and open a Hibernate session?

你也可以搜索一下Hibernate會話視圖過濾器來處理開放,自動關閉會話。