关于hibernate中的session与数据库连接关系以及getCurrentSession 与 openSession() 的区别

时间:2021-07-23 08:33:44
1.session与connection,是多对一关系,每个session都有一个与之对应的connection,一个connection不同时刻可以供多个session使用。
2.多个session与一个connection绑定,底层操作数据库的时会进行同步。
3.如果某个connection正在被某个session占用, open一个session,则创建一个新的connection与之对应。
4.有连接池的情况下,session关闭后,connection不一定关闭, 还可以查询到应用占用的连接,若超过最大空闲时间,被连接池回收释放。
5.有连接池的情况下,session使用完后不关闭,该connection被占用,若超过连接回收时间,也可被连接池回收释放。
6.非连接池情况下,一个session占用一个connection,若不关闭,该connection无法释放。
7.每个open的session都需要close。

1 getCurrentSession创建的session会和绑定到当前线程,而openSession不会。

2 getCurrentSession创建的线程会在事务回滚或事物提交后自动flush,自动关闭,而openSession必须手动flush,关闭。

使用getCurrentSession有什么好处?

getCurrentSession()的功能要从ThreadLocal类说起,ThreadLocal是一个线程作用范围的对象,就是说保存在他中的对象的生命周期是一个线程,Spring调用该方法后会将打开的Session放入ThreadLocal中进行保存,然后通过getCurrentSession()方法返回保存的Session对象,这样在一次请求(一个线程)中调用getCurrentSession()就都会从ThreadLocal中取出保存的Session对象,这样就保障了一次请求(一个线程)中使用的都是同一个Session对象了,可以保障事务操作的特性,像数据一致性和数据安全性(session不是线程安全的)等。

1》Configuration接口的作用是对Hibernate进行配置,以及对它进行启动。在Hibernate的启动过程中,Configuration类的实例首先定位映射文档的位置,读取这些配置,然后创建一个SessionFactory对象。

2》这里用到了一个设计模式――工厂模式,用户程序从工厂类SessionFactory中取得Session的实例。   
    
    令你感到奇怪的是SessionFactory并不是轻量级的!实际上它的设计者的意图是让它能在整个应用*享。典型地来说,一个项目通常只需要一 个SessionFactory就够了,但是当你的项目要操作多个数据库时,那你必须为每个数据库指定一个SessionFactory。   
  SessionFactory在Hibernate中实际起到了一个缓冲区的作用,它缓冲了Hibernate自动生成的SQL语句和一些其它的映射数据,还缓冲了一些将来有可能重复利用的数据。

3》Session接口对于Hibernate   开发人员来说是一个最重要的接口。然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都不会占用很多资源。这在实际项目 中确实很重要,因为在客户程序中,可能会不断地创建以及销毁Session对象,如果Session的开销太大,会给系统带来不良影响。但值得注意的是 Session对象是非线程安全的,因此在你的设计中,最好是一个线程只创建一个Session对象。   
    
    在Hibernate的设计者的头脑中,他们将session看作介于数据连接与事务管理一种中间接口。我们可以将session想象成一个持久对象 的缓冲区,Hibernate能检测到这些持久对象的改变,并及时刷新数据库。我们有时也称Session是一个持久层管理器,因为它包含这一些持久层相 关的操作,诸如存储持久对象至数据库,以及从数据库从获得它们。

对于session一级缓存的说法:

Hibernate中的Session是一级缓存,可以理解为线程的缓存,在线程运行期间一直存在。

session可以理解为一个可以操作数据库的对象,该对象中有操作数据库的方法,并且session可以存储要发送给DB的sql语句,缓存从DB中已经查出来的数据等。

在Java里面,缓存通常是指Java对象的属性占用的内存空间,通常是一些集合类型的属性。在Session接口的实现类SessionImpl中定义了一系列的Java集合,这些Java集合就构成了Session的缓存。