数据库连接何时被归还到连接池中?

柚子kik
  • 26

如题,尝试实现了一个测试代码,在某个线程中,开启了手动事物,并且查询了数据库,但是既不提交事务,也不回滚事务。然后开启了大量线程去查询数据库,从打印的日志看,此时这些线程使用的数据库连接都不是之前开启手动事物的线程所调用的连接。
那么在何种情况下,这个连接会归还到数据库连接池中,还是会被永久的挂起?

回复
阅读 1.1k
2 个回答

我尝试回答一下:由于你的事务处于长时间的等待过程中,我理解你的归还连接,可以等同于事务/连接超时。
首先作为客户端,一般会设置事务超时时间,druid连接池也有连接空闲超时时间,但你既然想创造问题,必然会设置为近乎永久等待。
然后作为数据库,本身配置了一系列超时参数,例如常见的8小时问题,数据库默认等待连接8h后断开(wait_timeout)。
如果你模拟客户端始终保持读取数据状态不响应,那么就会有读超时。(但看问题是读完停下,还是会回到空闲超时)。
事务本身有超时机制,例如innodb_lock_wait_timeout。(不过这个参数对于读锁,以及不同隔离级别下的生效与否没有实验过,似乎值得试一下)。
从实际使用经验来看,维持长时间的session比断开session要难...

开翻挖掘机
  • 94

基本上常见的数据库连接池组件在取得连接并使用完后,都需要手动显示的调用方法进行归还到连接池。
如果不归还,理论上是一直挂起的,直到挂起时间达到各种超时设置的阈值【楼上已经描述了各种超时配置大致的场景】。
另:查询不存在事务提交【不存在数据的变更修改】;

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
宣传栏