connection如何释放

可以把session与connection的使用关系分为三种
session使用的连接是被提供的,常常SessionFactory.openSession(connection,Interceptor?)
session使用的连接被借给客户端,常常session.connection
session通过connectionProvider.getConnection得到的连接
一个session中,connection释放时机也分为细分三种,正如org.hibernate.ConnectionReleaseMode定义的这样
AFTER_STATEMENT 每条SQL执行完马上释放
AFTER_TRANSACTION 事务结束之后释放
ON_CLOSE session关闭或失去连接之后释放
以下的讨论都与connection释放有关
如果session使用的连接是被提供的,那么当之后调用session.connection向session借取的连接就是之前被提供的连接,这类型的连接释放模式必须是ON_CLOSE,但即使这样,连接也不能由session关闭之后而关闭,既然是被提供的,当然生命周期不必与Session同步
如果session使用的连接是通过connectionprovider得到,并被提供给客户端,那么此时的客户端得到的是一个代理连接(被代理的对象正是connectionprovider获取的),当调用代理连接的close方法,并不能关闭被代理的连接,只是标识缓存中的borrowedConnection为空并设置代理连接不可用,因为既然是借用session的,当然不能够擅自了结连接。
如果session使用的连接是通过connectionprovider得到,那么连接的释放遵守ConnectionReleaseMode定义,AFTER_STATEMENT,AFTER_TRANSACTION,ON_CLOSE如果条件允许,即释放掉连接。我们现在谈谈这些条件:
在每条语句执行之后
如果释放模式为AFTER_STATEMENT 当每条SQL语句发送是理应释放连接,但下列条件之一不允许关闭
相关的Statement和ResultSet还有没关的
或者连接被借出去之后没关的
或者调用flush方法还没执行完
如果设置为自动提交并且事务尚未开始或已结束,则执行每条语句之后,也会释放连接
在事务结束之后
如果释放模式为AFTER_TRANSACTION 当事务提交后一定释放
释放模式为AFTER_STATEMENT并有Statement尚未关闭时 强制关闭Statement并释放连接
在Session关闭或disConnect丢掉连接时,释放连接
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值