3 回答

TA貢獻1810條經(jīng)驗 獲得超4個贊
Hibernat 對數(shù)據(jù)庫的操作是通過Session來實現(xiàn)的,這里的session不同于頁面間傳遞參數(shù)的session,
而是類似于JDBC中的 Connection。Session是Hibernate運作的中心,對象的生命周期、事務(wù)的管理、數(shù)據(jù)庫的存取都與session息息相關(guān)。
Session是由HibernateSessionFactory創(chuàng)建的,是線程安全的,可以讓多個執(zhí)行線程同時存取
HibernateSessionFactory而不會有數(shù)據(jù)共享的問題,但不能讓多個線程共享一個Session。
SessionFactory對象的創(chuàng)建:
Java代碼
Configuration cfg = new Configuration().configure();
SessionFactory sessions = cfg.buildSessionFactory();
session創(chuàng)建時使用了一個ThreadLocal類來建立一個Session管理的輔助類,使用ThreadLocal可以有效隔離執(zhí)行所用的數(shù)據(jù),
避開了Session的多線程之間的數(shù)據(jù)共享問題。
//創(chuàng)建一個線程本地變量。
Java代碼
public static final ThreadLocal<Session> threadlocal = new ThreadLocal<Session>();
public static org.hibernate.SessionFactory sessionFactory;
//獲取session的方法
public static Sessin getSession() throws HibernateException{
//返回線程局部變量的當前線程的值
Session s = (Session)threadLocal.get();
//如果sessionFactory為空,重新創(chuàng)建sessionFactory;如果線程為空,就打開一個新的session
if(session==null || !session.isOpen()){
if(sessionFactory == null){
rebuildSessionFactory(); session = (sessionFactory != null) sessionFactory.openSession():null;
// 將hibernate的session放入到線程中保存;只要這個線程不結(jié)束,都可以通過線程的get()方法來獲取
threadLocal.set(session);return session;
添加回答
舉報