Spring、Mybatis、数据库连接池之间的关系

  1. 数据库连接池统一在javax.sql.DataSource#getConnection()的实现类中实现

Druid的连接池在com.alibaba.druid.pool.DruidDataSource#getConnection()中的实现


image.png
  1. Spring中通过javax.sql.DataSource#getConnection()的实现来获取数据库连接,所以如果是Druid连接池,则通过该方法从池中获取连接
  2. Spring事务管理中是通过org.springframework.jdbc.datasource.DataSourceUtils#getConnection()方法来获取数据库连接的,该方法保证了同一个线程上获取到是同一个connection

注意: 同一次请求,多次调用dataSource.getConnection()会取到不同的connection,所以操作事务时,需使用DataSourceUtils.getConnection(dataSource)方式获取连接

  1. org.springframework.jdbc.datasource.DataSourceUtils底层获取connection的逻辑:

判断是否开启事务,若开启事务则调用org.springframework.transaction.support.TransactionSynchronizationManager#bindResource()方法将当前线程与一个事务绑定,采用的方式就是ThreadLocal

  1. Mybatis内部获取数据库连接也是通过org.springframework.jdbc.datasource.DataSourceUtils#getConnection()获取

你可能感兴趣的:(Spring、Mybatis、数据库连接池之间的关系)