Hibernate getCurrentSession()与openSession()的区别

在使用ssh框架开发时,使用spring代替管理数据库的连接,一般的dao层格式为

先获取session,然后开事务,然后处理逻辑,然后关闭事务。

在开发中遇到一个问题。在dao层处逻辑时,需要跳到其他的层去处理逻辑,那么如果在这个其他逻辑的地方也是用了同样的方式

获取session,并且提交事务后,返回原逻辑中使用该session会报session is close的异常。

原因:查过资料发现getSessionFactory获取session一般有两种方法:

1.getCurrentSession();

2.openSession();

第一种方法会先去查询是否有已经打开的session,如果有,直接返回,如果没有,调用openSession打开一个新的返回。所以以上情况是 在原逻辑打开了一个session a,但是在中途处理的逻辑中,我再次使用方法1获取sesison,也就是获取到的session a,我使用完后commit,spring会自动关闭该session,所以在返回原逻辑继续执行时,报了session is close的异常。

第二种方法是直接打开一个新的session返回,算是非常规逻辑使用spring获取session的一种替代方法。只是需要方法2打开的session需要自己手动关闭,以免造成session无功占用。

参考文档:https://www.cnblogs.com/mengfanrong/p/5346928.html

https://justsee.iteye.com/blog/1061576

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值