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(Connection connection,boolean autoClose,long timestamp,Interceptor sessionLocalInterceptor)方法.这个方法中参数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 already closed"异常, 这也正是这一系列博客的引子.
本文通过源码层面详细对比了Hibernate中getCurrentSession与openSession两种创建Session的方式,并总结了各自的优劣。文章指出getCurrentSession与openSession在创建Session时并无实质性的技术优势差异。
1087

被折叠的 条评论
为什么被折叠?



