Session是由SessionFactory所創(chuàng)建,SessionFactory是執(zhí)行緒安全的(Thread-safe),您可以讓多個(gè)執(zhí)行緒同時(shí)存取SessionFactory而不會(huì)有資料共用的問題,然而Session則不是設(shè)計(jì)為執(zhí)行緒安全的,所以試圖讓多個(gè)執(zhí)行緒共用一個(gè) Session,將會(huì)產(chǎn)生因資料共用而發(fā)生混亂的問題。
在Hibernate參考手冊中的 Quickstart with Tomcat 中,示範(fàn)了一個(gè)HibernateUtil,它使用了ThreadLocal類別來建立一個(gè)Session管理的輔助類,這是Hibernate的Session管理一個(gè)廣為應(yīng)用的解決方案,ThreadLocal是 Thread-Specific Storage 模式 的一個(gè)運(yùn)作實(shí)例。
由於Thread-Specific Stroage模式可以有效隔離執(zhí)行緒所使用的資料,所以避開Session的多執(zhí)行緒之間的資料共用問題,以下列出Hibernate參考手冊中的HibernateUtil類:
HibernateUtil.java
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.cfg.Configuration;


/**//**
* @author Administrator
*
* TODO To change the template for this generated type comment go to Window -
* Preferences - Java - Code Style - Code Templates
*/

public class HibernateUtil
{
private static Log log = LogFactory.getLog(HibernateUtil.class);

private static final SessionFactory sessionFactory;

static
{

try
{
sessionFactory = new Configuration().configure()
.buildSessionFactory();

} catch (Throwable ex)
{
log.error("Initial SessionFactory creation failed.", ex);
throw new ExceptionInInitializerError(ex);
}
}

public static final ThreadLocal session = new ThreadLocal();


public static Session currentSession()
{
Session s = (Session) session.get();

if (s == null)
{
s = sessionFactory.openSession();
session.set(s);
}
return s;
}


public static void closeSession()
{
Session s = (Session) session.get();
if (s != null)
s.clear();
session.set(null);
}
}
在同一個(gè)執(zhí)行緒中,Session被暫存下來了,但無須擔(dān)心資料庫連結(jié)Connection持續(xù)占用問題,Hibernate會(huì)在真正需要資料庫操作時(shí)才(從連接池中)取得Connection。
在程式中可以這麼使用HibernateUtil:
在Web應(yīng)用程式中,可以藉助Filter來進(jìn)行Session管理,在需要的時(shí)候開啟Session,並在Request結(jié)束之後關(guān)閉Session,這個(gè)部份,在 JavaWorld 技術(shù)論壇 的 Wiki 上有篇 在filter中關(guān)閉session 可以參考。
在Hibernate參考手冊中的 Quickstart with Tomcat 中,示範(fàn)了一個(gè)HibernateUtil,它使用了ThreadLocal類別來建立一個(gè)Session管理的輔助類,這是Hibernate的Session管理一個(gè)廣為應(yīng)用的解決方案,ThreadLocal是 Thread-Specific Storage 模式 的一個(gè)運(yùn)作實(shí)例。
由於Thread-Specific Stroage模式可以有效隔離執(zhí)行緒所使用的資料,所以避開Session的多執(zhí)行緒之間的資料共用問題,以下列出Hibernate參考手冊中的HibernateUtil類:
HibernateUtil.java



























































在同一個(gè)執(zhí)行緒中,Session被暫存下來了,但無須擔(dān)心資料庫連結(jié)Connection持續(xù)占用問題,Hibernate會(huì)在真正需要資料庫操作時(shí)才(從連接池中)取得Connection。
在程式中可以這麼使用HibernateUtil:
Session session = HibernateUtil.currentSession();
User user = (User) session.load(User.class, new Integer(1));
System.out.println(user.getName());
HibernateUtil.closeSession();
User user = (User) session.load(User.class, new Integer(1));
System.out.println(user.getName());
HibernateUtil.closeSession();
在Web應(yīng)用程式中,可以藉助Filter來進(jìn)行Session管理,在需要的時(shí)候開啟Session,並在Request結(jié)束之後關(guān)閉Session,這個(gè)部份,在 JavaWorld 技術(shù)論壇 的 Wiki 上有篇 在filter中關(guān)閉session 可以參考。