问题描述
在代码中,只要借助上面这个工具类获取Session实例,我们就可以实现线程范围内的Session共享,从而避免了在线程中频繁的创建和销毁Session实例。不过注意在线程结束时关闭Session。同时值得一提的是,新版本的Hibernate在处理Session的时候已经内置了延迟加载机制,只有在真正发生数据库操作的时候,才会从数据库连接池获取数据库连接,我们不必过于担心Session的共享会导致整个线程生命周期内数据库连接被持续占用。上面的HibernateUtil类可以应用在任何类型的Java程序中。特别的,对于Web程序而言,我们可以借助Servlet2.3规范中新引入的Filter机制,轻松实现线程生命周期内的Session管理(关于Filter的具体描述,请参考Servlet2.3规范)。Filter的生命周期贯穿了其所覆盖的Servlet(JSP也可以看作是一种特殊的Servlet)及其底层对象。Filter在Servlet被调用之前执行,在Servlet调用结束之后结束。因此,在Filter中管理Session对于Web程序而言就显得水到渠成。下面是一个通过Filter进行Session管理的典型案例:publicclassPersistenceFilterimplementsFilter{protectedstaticThreadLocalhibernateHolder=newThreadLocal();publicvoiddoFilter(ServletRequestrequest,ServletResponseresponse,FilterChainchain)throwsIOException,ServletException{hibernateHolder.set(getSession());try{……chain.doFilter(request,response);……}finally{Sessionsess=(Session)hibernateHolder.get();if(sess!=null){hibernateHolder.set(null);try{sess.close();}catch(HibernateExceptionex){thrownewServletException(ex);}}}}……}