快速业务通道

hibernate3学习笔记(六) Session管理 - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-20

hibernate3学习笔记(六) Session管理

时间:2011-02-02

请注意,在hibernate中SessionFactory是被设计成线程安全(Thread-safe)的,遗憾的是,Session却线程不安全。

这就意味着:有可能多个线程共享并操作同一个Session从而很容易使数据混乱。

解决的办法如下:(其实hibernate的文档中早已经提过了)

新建HibernateUtil类:

1.import org.apache.commons.logging.Log;2.import org.apache.commons.logging.LogFactory;3.import org.hibernate.*;4.import org.hibernate.cfg.*;5.6.public class HibernateUtil {7.    private static Log log = LogFactory.getLog(HibernateUtil.class);8.    private static final SessionFactory sessionFactory;9.
10.    static {11.        try {12.            // Create the SessionFactory
13.            sessionFactory = new Configuration().configure()14.                                                .buildSessionFactory();15.        } catch (Throwable ex) {16.            // Make sure you log the exception, as it might be swallowed
17.            log.error("Initial SessionFactory creation failed.", ex);18.            throw new ExceptionInInitializerError(ex);19.        }20.    }21.
22.    public static final ThreadLocal session = new ThreadLocal();23.
24.    public static Session currentSession() {25.        Session s = (Session) session.get();26.
27.        // Open a new Session, if this Thread has none yet
28.        if (s == null) {29.            s = sessionFactory.openSession();30.            session.set(s);31.        }32.
33.        return s;34.    }35.
36.    public static void closeSession() {37.        Session s = (Session) session.get();38.
39.        if (s != null) {40.            s.close();41.        }42.
43.        session.set(null);44.    }45.}

hibernate3学习笔记(六) Session管理(2)

时间:2011-02-02

这样,在程序中可这样调用:

1.Session session = HibernateUtil.currentSession();2.User user = (User) session.load(User.class, new Integer(1));3.System.out.println(user.getName());4.HibernateUtil.closeSession();

在web应用中,可以借由Filter来进行session管理。在需要session的时候开启session,在request结束之后关闭session。

HibernateSessionUtil.java

1.import java.io.Serializable;2.3.import net.sf.hibernate.HibernateException;4.import net.sf.hibernate.Session;5.import net.sf.hibernate.SessionFactory;6.import net.sf.hibernate.Transaction;7.
8.public class HibernateSessionUtil implements Serializable9.{10.    public static final ThreadLocal tLocalsess = new ThreadLocal();11.
12.    public static final ThreadLocal tLocaltx = new ThreadLocal();13.
14.    /*15.     * getting the thread-safe session for using16.     */17.    public static Session currentSession(){18.        Session session = (Session) tLocalsess.get();19.
20.        //open a new one, if none can be found.
21.        try{22.            if (session == null){23.                session = openSession();24.                tLocalsess.set(session);25.            }26.        }catch (HibernateException e){27.            throw new InfrastructureException(e);28.        }29.    

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号