Session获取不到的状况及解决办法(源码解析)

  本博客是本身在学习和工做途中的积累与总结,欢迎你们转载,转载时请注明出处,请尊重他人努力成果,谢谢。
1. 当有连个sessionFactory时,容易产生获取不到session的状况
缘由: 进入事务@Service标注的业务类的业务方法后,当进行数据库操做时,会经过sessonFactory.getCurrentSession();方法获取,原理,当本地线程中不存在session时,会调用openSession建立一个并绑定到本地线程中,而后 调用,注意:这里的建立是当前事务该类中事务所绑定的sessionFactory的session,因此在同一方法中的后N个sessionFactory获取session时,只要他们的sessionFactory与当前事务所配置的sessionFactory不是同一个,会报获取不到session的异常,由于该session获取不到。或者更详细地说,因为spring维护一个ThreadLocal<Thread,Map<Object,Object>>来解决线程安全问题,那么,以当前线程做为key值,取到存有当前线程中的所需的键值对map,而其中就拥有sessionFactory和SessionHolder的键值对,而key值SessionFactory对象即为当前事务的sessionFactory,因此若是是其余sessionFactory去获取的话,会致使拿取出来的值为null。
补充一下:sessionHolder就是拿去session的对象哦 ,在CurrentSessionContext的接口实现类中的currentSession方法中。
解决办法:
1. 经常使用的sessionFactory的事务管理可使用注解配置 ,不经常使用的可使用spring的声明式事务管理配置(能够配置多个),这样就互不相干,不会出现拿不到sesson的问题
2. 后续的sessionFactory须要本身手动的调用openSession,来进行操做,而且须要手动关闭。
补充一下,使用懒加载也会致使拿不到session,但于此问题无关,能够配置open session in view,但会极其损耗应用性能。
源码解析:
此中,resources.get()方法是为了拿去当前线程中的全部键值对,而sessionFactory的实例对象在此map中为键,值为SessionHolder实例对象(org.springframework.orm.hibernate4.SessionHolder),
而惟有事物中配置的sessionFactory才能经过map取出value(SessionHolder对象),因此返回null。
接下来:
 
返回null
因为value=null,因此抛一个异常喽
相关文章
相关标签/搜索