spring+Hibernate openSession()和getCurrentSession()

来源:互联网 发布:a 算法解决八数码难题 编辑:程序博客网 时间:2024/05/21 09:25

最近比较烦躁,学过Mybatis又来学Hibernate,总觉得Hibernate太麻烦,(其实也挺简单的,先入为主了),由于没怎么看过源代码,都是通过网友总结加上自己的实验得出来的一些结论,做一个笔记。
实验一:单独使用Hibernate框架
1、openSession()在不开启事务的情况下执行操作:
结果:可以查询出结果,更删改查也可以执行成功,但是数据库的数据不变。
2、getCurrentSession()在不开启事务的情况下执行操作:
结果:不管是查询还是增删改都会抛出异常。
3、openSession()在开启事务的情况下执行操作:
结果:增删改查都可以执行成功。
4、getCurrentSession()在开启事务的情况下执行操作:
结果:增删改查都可以执行成功。
总结:
一、openSession()得到Session可以在显示开启的环境中使用也可以在不开启事务的环境中使用(只能查询);
getCurrentSession()必须在显示的开启事务环境中使用。
二、openSession()是否显示开启事务决定了Session获取连接的时机。不开启事务的情况下数据库连接是在创建Statement时获得。因此在配置二级缓存的情况get()对象时,如果二级缓存中有需要的对象时,不会占用数据库连接。相反开启事务的情况下,无论二级缓存中是否有对象,都会占用数据库连接。
三、getCurrentSession()总会占用数据库连接。

实验二:使用spring与Hibernate整合
我们可以通过三种方式获取Session
1、继承HibernateDaoSupport,类然后this.getSession();
利用这种方式获取的Session在方法执行结束之后不会自动关闭,也就是说我们必须通过session.close()或者releaseSession(session)来手动进行关闭,否则会导致内存泄漏或者连接耗尽等问题。如果开启事务,那么spring会为我们自动关闭session:内部通过判断是否显示开启releaseSession(session)关闭,如果没关闭就会自己调用关闭。如果我们设置这样关闭,正常关闭,而如果我们用session.close(),会报 Session is closed异常,我们就不要画蛇添足了;另外我们设置getSession(boolean allowCreate)参数:默认为true,意味着创建一个事务。而如果设置为false,那么只能从当前事务或者一个新的事务中获取Session, 因为false无法创建新的事务,那么只能从当前事务获取Session,所设置false以要显示的开启事务,设置为ture就可以啦。
2、getCurrentSession()和openSession()
学过Hibernate都知道这两种获取Session方式是通过SessionFactory获取的,他们的区别也很简单:
I、getCurrentSession()创建的session会和绑定到当前线程,而openSession不会;
II、getCurrentSession()创建的session会在事务回滚或事务提交后自动关闭,而openSession必须要手动关闭。
对于getCurrentSession()方法:我们可以显示开启事务也可以不必显示开启事务
区别:如果不开启事务也是运行成功的,那么操作更新和删除都不能成功,插入和查询都是可以的(亲测)。建议都开启事务
对于openSession()方法:
这个方法一般在spring与Hibernate的集成中不直接使用,因为他打开一个Session,这个Session与上下文并没有关系,如果对其进行事务控制,会发现不起作用,原因就是事务控制必须是同一个连接,而openSession打开的session与上下文无关。所以不建议使用
3、HibernateTemplate
因为操作数据库的方式都是固定的,获取连接-执行操作-释放连接,那么我们就可以把这些操作都封装起来的,需要使用的时候直接调用即可。通常开发项目使用这种方式,

底层理解:
在sessionFactory启动的时候,Hibernate会根据配置创建相应的CurrentSessionContext,在getCurrentSession()被调用的时候,实际被执行的方法是CurrentSessionContext.currentSession(),在currentSession()执行时,如果当前Session为空,currentSession会调用SessionFactory的openSession,
这样既保证了Session的线程安全,又不用每次数据库操作都重新获取一个Session实例,实现了Session重用

阅读全文
0 0
原创粉丝点击