Hibernate(22):openSession的执行细节及相对优势
Hibernate(21):getCurrentSession还是用openSession?中, 我们从getCurrentSession执行细节上总结了这个方法生成session的优点. 本篇中,我们还从openSession的执行来看,openSession有没有优势,优势又是什么.
??? 我们先从sessionFactory.openSession()一句开始入手.
???在sessionFactory.openSession()方法里,hibernate又调用了sessionFactory实现类SessionFactoryImpl中的openSession(interceptor), interceptor是个什么? 它从哪里来的? 这里边是否藏着什么玄机?看到其类型为org.hibernate.Interceptor接口,它是在new Configuration时由interceptor =EmptyInterceptor.INSTANCE语句赋了值, 而这个EmptyInterceptor.INSTANCE也正它名字说的那样,没做什么事. 这样,我们得出openSession(interceptor)时的interceptor没有给即将诞生的Session带来什么优势. (BTW,这个interceptor一般用来干啥? 又怎么来设置? 待日后做针对性实验观察)
???接着看openSession(interceptor)又调用的openSession(Connectionconnection,boolean autoClose,long timestamp,InterceptorsessionLocalInterceptor)方法.这个方法中参数connection为null, autoClose为false.有一个long类型的timestamp,它是干啥的? 料它也不会对session的创建带来什么优势,不过"搂草打兔子"地把它也研究下.看SessionImpl类,发现timestamp的存在仅仅是为了实现SessionImplementor接口里定义的方法getTimestamp. 再往下追,这个getTimestamp方法在哪调用? 主要用来做什么? 有如下所示的调用:
?
上面getTimestamp的调用中timestamp大多是作为txTimestamp的,与事务有关, 待日后再专门研究,此篇中先放它一马.
??? 这样,一个session就创建出来了, 那跟getCurrentSession相比,有什么优势呢?答案是: 没有.
------------------
结语. 用了两个篇幅, 从源码层面上仔细对比了getCurrentSession跟openSession相比的优势,见Hibernate(21):getCurrentSession还是用openSession中的总结.? 那么跟跟openSession相比,getCurrentSession在使用上有什么注意的呢?到现在发现的一个就是,由于getCurrentSession方法返回的session在做事务的commit时,session可能会自动给关掉,这样若自己的代码中再调用session.close时就抛出了"Session was alreadyclosed"异常, 这也正是这一系列博客的引子.??