• Mybatis 的连接池技术


    在 Mybatis 的 SqlMapConfig.xml 配置文件中,通过<dataSource type=”pooled”>来实现 Mybatis 中连接池的配置。
    一、Mybatis连接池的分类
           在Mybatis中,我们将他的数据源dataSource分为以下几类:
          

         可以看出Mybatis将数据源分为三类

        UNPOOLED    不使用连接池的数据源

        POOLED           使用连接池的数据源

        JNDI                  使用JNDI实现的数据源

    具体结构如下:

     相应的,Mybatis内部分别定义实现了java.sql.DataSource接口的UnPooledDataSource,PooledDataSource类来标识两种类型的数据源

        在这三种数据源中,我们一般采用的是Pooled数据源,很多时候我们所说的数据源就是为了更好的管理数据库连接,也就是我们所说的连接池技术

    二、Mybatis中数据源的配置

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

    <!-- 配置数据源(连接池)信息 --> <dataSource type="POOLED"> 
    <property name="driver" value="${jdbc.driver}"/> <property name="url" value="${jdbc.url}"/> <property name="username" value="${jdbc.username}"/> <property name="password" value="${jdbc.password}"/> </dataSource>
      
       MyBatis 在初始化时,根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即:
    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
    */
    public interface DataSourceFactory {
     void setProperties(Properties props);
     DataSource getDataSource();
    }
    MyBatis 创建了 DataSource 实例后,会将其放到 Configuration 对象内的 Environment 对象中, 供
    以后使用。
    具体分析过程如下:
    1.先进入 XMLConfigBuilder 类中,可以找到如下代码:
    2.分析 configuration 对象的 environment 属性,结果如下:

    四、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<User> list = sqlSession.selectList("findUserById",41);
    System.out.println(list.size());
    }
    只有当第 4 句 sqlSession.selectList("findUserById"),才会触发 MyBatis 在底层执行下面这个方
    法来创建 java.sql.Connection 对象。
    如何证明它的加载过程呢?
    我们可以通过断点调试,在 PooledDataSource 中找到如下 popConnection()方法,如下所示:

     

    下面是连接获取的源代码:
    最后我们可以发现,真正连接打开的时间点,只是在我们执行SQL语句时,才会进行。其实这样做我们也可以
    进一步发现,数据库连接是我们最为宝贵的资源,只有在要用到的时候,才去获取并打开连接,当我们用完了就再
    立即将数据库连接归还到连接池中
  • 相关阅读:
    我的北漂之路 北漂如饮水,冷暖自知
    初学者路径规划 | 人生苦短我用Python
    web开发快速提高工作效率的一些资源
    工作中如何快速成长和学习?
    把手账打印成书 把回忆装订成册
    算法训练 K好数 (DP)
    算法训练 最大的算式(DP)
    算法训练 数字三角形(DP)
    算法训练 Balloons in a Box (枚举,模拟)
    算法训练 Pollution Solution(计算几何)
  • 原文地址:https://www.cnblogs.com/mingqi-420/p/13025143.html
Copyright © 2020-2023  润新知