BANG老師: 請教一下Hibernate的session問題

wing123發表於2009-02-24
我使用struts1.x + Hibernate3.X開發,不考慮用Spring

首先在Filter中建立和關閉session

public class HibernateFilter implements Filter {

//透過ThreadLocal來生成session
private static ThreadLocal hibernateHolder = new ThreadLocal();

//SessionFactory是--執行緒安全的
private static SessionFactory factory = null;

public void destroy() {

}

public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
try {
//程式首先執行doFilter方法,繼續向下傳遞,避免程式在此停住
chain.doFilter(request, response);
} finally {
//結束session的生命,程式執行結束必經地
Session session = (Session)hibernateHolder.get();
if(session != null) {
if(session.isOpen()) {
session.close();
}
//ThreadLocal也要remove
hibernateHolder.remove();
}
}
}

public void init(FilterConfig config) throws ServletException {
//filter在Tomat啟動是隻執行一次,在此建立SessionFactory是最好的
try {
Configuration cfg = new Configuration().configure();
factory = cfg.buildSessionFactory();
System.out.println("--------SessionFactory---------");
} catch (Exception e) {
e.printStackTrace();
}
}

//返回session,而session是由SessionFactory建立的,SessionFactory是重量級的
//最好只建立一次
public static Session getSession() {
//首先要判斷當前的ThreadLocal中是否有Session的例項
Session session = (Session)hibernateHolder.get();
//有就取出,沒有就建立並放入ThreadLocal中後返回例項
if(session == null) {
session = factory.openSession();
hibernateHolder.set(session);
}
return session;
}


}

然後,在透過ThreadLocal得到session(session = HibernateFilter.getSession();)

1.那麼,假設有兩個客戶端,分別對同一資料進行都、寫操作,會不會引起髒讀?

2.如果併發訪問大時,同一session中的事務增多,該如何解決?


[該貼被admin於2009-02-25 18:44修改過]

相關文章