鲁班学院java架构师成长路线

之前WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自己的连接池技术。在 Mybatis 的 SqlMapConfig.xml 配置文件中,通过

一.Mybatis 连接池的分类
java架构师成长路线-Mybatis连接池与事务深入_第1张图片
java架构师成长路线-Mybatis连接池与事务深入_第2张图片
二.Mybatis 中数据源的配置

我们的数据源配置就是在 SqlMapConfig.xml 文件中,具体配置如下:






dataSource>

MyBatis 在初始化时,根据
type=”POOLED”:MyBatis 会创建 PooledDataSource 实例type=”UNPOOLED”:MyBatis会创建 UnpooledDataSource 实例type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用

三、Mybatis 中 DataSource 的存取

MyBatis 是 通 过 工 厂 模 式 来 创 建 数 据 源 DataSource 对 象 的 , MyBatis 定 义 了 抽 象 的工 厂 接口:
org.apache.ibatis.datasource.DataSourceFactory,通过其 getDataSource()方法返回数据源DataSource。
下面是 DataSourceFactory 源码,具体如下:
package org.apache.ibatis.datasource;
import java.util.Properties;
import javax.sql.DataSource;
/**

  • @author Clinton Begin
    */
    public interface DataSourceFactory {
    void setProperties(Properties props);
    DataSource getDataSource();
    }

3.1.先进入 XMLConfigBuilder 类中,可以找到如下代码:

java架构师成长路线-Mybatis连接池与事务深入_第3张图片
3.2.分析 configuration 对象的 environment 属性,结果如下:
java架构师成长路线-Mybatis连接池与事务深入_第4张图片
四、Mybatis 中连接的获取过程分析

当我们需要创建 SqlSession 对象并需要执行 SQL 语句时,这时候 MyBatis 才会去调用 dataSource 对象来创建java.sql.Connection对象。也就是说,
java.sql.Connection对象的创建一直延迟到执行SQL语句的时候。

@Test
public void testSql() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = factory.openSession();
List

只有当第 4 句 sqlSession.selectList("findUserById"),才会触发 MyBatis 在底层执行下面这个方法来创建 java.sql.Connection 对象。

如何证明它的加载过程呢?

我们可以通过断点调试,在 PooledDataSource 中找到如下 popConnection()方法,如下所示:

java架构师成长路线-Mybatis连接池与事务深入_第5张图片
分析源代码,得出 PooledDataSource 工作原理如下:
java架构师成长路线-Mybatis连接池与事务深入_第6张图片
最后我们可以发现,真正连接打开的时间点,只是在我们执行SQL语句时,才会进行。其实这样做我们也可以进一步发现,数据库连接是我们最为宝贵的资源,只有在要用到的时候,才去获取并打开连接,当我们用完了就再立即将数据库连接归还到连接池中。
java架构师成长路线-Mybatis连接池与事务深入_第7张图片