问题描述
看了几篇关于session关闭的文章,还是不能确定,初学hibernate3 不知道session是否需要手动关闭,没有用spring和其它的托管,web应用程序中myeclipse生成的dao中的方法如下: 不知道是否需要在save方法里或查询的方法里加上finally{ HibernateSessionFactory.closeSession();}如果不需要关闭的话,具体原因是什么呢?public void save(Custinfo transientInstance) {log.debug("saving WxGzjg instance");try {Transaction tran = null;tran = (Transaction) getSession().beginTransaction();getSession().save(transientInstance);log.debug("save successful");tran.commit();} catch (RuntimeException re) {log.error("save failed", re);throw re;}}我用myeclipse6.5,hibernate3.0生成的SessionFactory 类如下:package com.soft.hibernate;import org.hibernate.HibernateException;import org.hibernate.Session;import org.hibernate.cfg.Configuration;/** * Configures and provides access to Hibernate sessions, tied to the * current thread of execution. Follows the Thread Local Session * pattern, see {@link http://hibernate.org/42.html }. */public class HibernateSessionFactory { /** * Location of hibernate.cfg.xml file. * Location should be on the classpath as Hibernate uses * #resourceAsStream style lookup for its configuration file. * The default classpath location of the hibernate config file is * in the default package. Use #setConfigFile() to update * the location of the configuration file for the current session. */ private static String CONFIG_FILE_LOCATION = "/hibernate.cfg.xml";private static final ThreadLocal<Session> threadLocal = new ThreadLocal<Session>(); private static Configuration configuration = new Configuration(); private static org.hibernate.SessionFactory sessionFactory; private static String configFile = CONFIG_FILE_LOCATION; private static final Log log = LogFactory.getLog(HibernateSessionFactory.class); static { try {configuration.configure(configFile);sessionFactory = configuration.buildSessionFactory();} catch (Exception e) {log.info("Error Creating SessionFactory");System.err.println("Error Creating SessionFactory");e.printStackTrace();} } private HibernateSessionFactory() { }/** * Returns the ThreadLocal Session instance. Lazy initialize * the <code>SessionFactory</code> if needed. * * @return Session * @throws HibernateException */ public static Session getSession() throws HibernateException { Session session = (Session) threadLocal.get();if (session == null || !session.isOpen()) {if (sessionFactory == null) {rebuildSessionFactory();}session = (sessionFactory != null) ? sessionFactory.openSession(): null;threadLocal.set(session);} return session; }/** * Rebuild hibernate session factory * */public static void rebuildSessionFactory() {try {configuration.configure(configFile);sessionFactory = configuration.buildSessionFactory();} catch (Exception e) {log.info("Error Creating SessionFactory");System.err.println("%%%% Error Creating SessionFactory %%%%");e.printStackTrace();}}/** * Close the single hibernate session instance. * * @throws HibernateException */ public static void closeSession() throws HibernateException { Session session = (Session) threadLocal.get(); threadLocal.set(null); if (session != null) { session.close(); } }/** * return session factory * */public static org.hibernate.SessionFactory getSessionFactory() {return sessionFactory;}/** * return session factory * *session factory will be rebuilded in the next call */public static void setConfigFile(String configFile) {HibernateSessionFactory.configFile = configFile;sessionFactory = null;}/** * return hibernate configuration * */public static Configuration getConfiguration() {return configuration;}}
解决方案
当然需要关闭session.不关闭,服务器的资源会被严重浪费.如果没有用到hibernate的lazy,那么就在查询结束的时候就关闭session如果用到了lazy那么就用filter的方式关闭.个人建议用完一个session就关闭一个session.像你这样刚接触hibernate,可能对于lzay还不太明白.你可以先学会用会hibernate,过段时间再去深入学习,用好hibernate,尤其是性能的优化.
解决方案二:
在配置文件中可以调节session的有效时间,超过这个时间就会自动关闭,默认是30分钟。你可以根据你的实际情况来配置自动关闭的时间。
解决方案三:
如果你没用spring的话,可以选择过滤器关闭session,但是这样jsp页面就没办法重用这个session了。你可以写个request监听器,在request销毁的时候关闭Session这样可以实现hibernat的延迟价值。在jsp页面也可以用到session