durid连接池中的连接是如何自动释放的?

大马扎
  • 402

使用springBoot集成druid连接池,程序在什么时候释放连接到连接池里?是不是事务提交后就释放了?还是当前线程执行完毕后释放呢?

回复
阅读 2.7k
2 个回答

一般是在connection.close() 的时候归还到连接池。参考DruidPooledConnection.close()JDBCTemplate

释放连接这个动作和数据源是什么类型是无关的,也就是和你用c3p0,druid,HikariDataSource,这些玩意无关,每个实现类自己去实现释放连接的操作即可;
回到正题,什么时候释放
因为没有说orm框架,所以拿常用的mybatis和jdbcTemplate来举例子;jdbcTemplate的源码相对来说不复杂,update方法最终走到了他的execute方法,方法的finally 里面手动调用了DataSourceUtils.releaseConnection(con, this.getDataSource());所以这个的释放时机在执行sql的方法种就处理了;

对于mybatis,不讲mybatis的执行原理,只说结果,这里释放连接的代码是SqlSessionSynchronization,最终是SpringManagedTransaction.close释放连接,而触发点则在TransactionInterceptor.commitTransactionAfterReturning,获取事务管理器,提交当前事务,最终走到了org.springframework.transaction.support.AbstractPlatformTransactionManager#triggerBeforeCommit()方法,然后回调所有注册的TransactionSynchronization(即开始的SqlSessionSynchronization);

总结的话,
mybatis和jdbcTemplate的差异就在这里,简单一点来说,jdbcTemplate.update这个代码里面包含了连接释放的代码,mybatis则是insert()方法过程中不连接释放,通过事务aop的后续回调,在最终提交事务前释放连接;

宣传栏