konhon

忘掉過去,展望未來。找回自我,超越自我。
逃避不一定躲的过, 面对不一定最难过, 孤单不一定不快乐, 得到不一定能长久, 失去不一定不再拥有, 可能因为某个理由而伤心难过, 但我却能找个理由让自己快乐.

Google

BlogJava 首页 新随笔 联系 聚合 管理
  203 Posts :: 0 Stories :: 61 Comments :: 0 Trackbacks
Session是由SessionFactory所創建,SessionFactory是執行緒安全的(Thread-safe),您可以讓多個執行緒同時存取SessionFactory而不會有資料共用的問題,然而Session則不是設計為執行緒安全的,所以試圖讓多個執行緒共用一個 Session,將會产生因資料共用而發生混亂的問題。

在Hibernate參考手冊中的 Quickstart with Tomcat 中,示範了一個HibernateUtil,它使用了ThreadLocal類別來建立一個Session管理的輔助類,這是Hibernate的Session管理一個廣為應用的解決方案,ThreadLocal是 Thread-Specific Storage 模式 的一個運作實例。

由於Thread-Specific Stroage模式可以有效隔離執行緒所使用的資料,所以避開Session的多執行緒之間的資料共用問題,以下列出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);
    }

}


在同一個執行緒中,Session被暫存下來了,但無須擔心資料庫連結Connection持續占用問題,Hibernate會在真正需要資料庫操作時才(從連接池中)取得Connection。

在程式中可以這麼使用HibernateUtil:
Session session = HibernateUtil.currentSession();
User user = (User) session.load(User.class, new Integer(1));
System.out.println(user.getName());
HibernateUtil.closeSession();

在Web應用程式中,可以藉助Filter來進行Session管理,在需要的時候開啟Session,並在Request結束之後關閉Session,這個部份,在 JavaWorld 技術論壇Wiki 上有篇 在filter中關閉session 可以參考
posted on 2005-08-10 20:14 konhon 优华 阅读(2234) 评论(0)  编辑  收藏 所属分类: Hibernate

只有注册用户登录后才能发表评论。


网站导航:
博客园   IT新闻   Chat2DB   C++博客   博问