使用springBoot集成druid
连接池,程序在什么时候释放连接到连接池里?是不是事务提交后就释放了?还是当前线程执行完毕后释放呢?
释放连接这个动作和数据源是什么类型是无关的,也就是和你用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的后续回调,在最终提交事务前释放连接;
8 回答6.6k 阅读
4 回答718 阅读✓ 已解决
2 回答3.4k 阅读
3 回答1.9k 阅读✓ 已解决
1 回答2.2k 阅读✓ 已解决
1 回答2.1k 阅读✓ 已解决
1 回答799 阅读✓ 已解决
一般是在
connection.close()
的时候归还到连接池。参考DruidPooledConnection.close()
和JDBCTemplate