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丢掉连接时,释放连接

你可能感兴趣的:(Connection)