- 数据库连接池统一在javax.sql.DataSource#getConnection()的实现类中实现
Druid的连接池在com.alibaba.druid.pool.DruidDataSource#getConnection()中的实现
image.png
- Spring中通过javax.sql.DataSource#getConnection()的实现来获取数据库连接,所以如果是Druid连接池,则通过该方法从池中获取连接
- Spring事务管理中是通过org.springframework.jdbc.datasource.DataSourceUtils#getConnection()方法来获取数据库连接的,该方法保证了同一个线程上获取到是同一个connection
注意: 同一次请求,多次调用dataSource.getConnection()会取到不同的connection,所以操作事务时,需使用DataSourceUtils.getConnection(dataSource)方式获取连接
- org.springframework.jdbc.datasource.DataSourceUtils底层获取connection的逻辑:
判断是否开启事务,若开启事务则调用org.springframework.transaction.support.TransactionSynchronizationManager#bindResource()方法将当前线程与一个事务绑定,采用的方式就是ThreadLocal
- Mybatis内部获取数据库连接也是通过org.springframework.jdbc.datasource.DataSourceUtils#getConnection()获取
网友评论