Mybatis 框架学习9 - mybatis 连接池的使用原理

Mybatis 的连接池

1. 连接池介绍

我们在实际开发中都会使用连接池。

因为连接池可以减少我们获取连接所耗费的时间。

其实连接池就像一个容器,它会把连接都初始化出来放在一个容器里面,这种容器大家可以理解为一个瓶子,想要用就取一个。当一个应用或者线程取出第一个连接并且占用该连接,那么连接池中的连接的顺序就会重新排序(挨个向前进行添补,比如5号连接变为4号连接)。

当一个线程或者应用解除对一个连接的占用,那么,这个连接会重新回到连接池中。同时排在容器序列的最后一个。

容器其实就是一个集合对象,该集合必须是线程安全的,不能两个线程拿到同一个连接。该集合还必须实现队列的特性:先进先出。

2. Mybatis 的连接池

2.1 Mybatis 连接池的分类:

  • Mybatis将自己的数据源分为三类:

    • UNPOOLED - 不使用连接池的数据源
    • POOLED - 使用连接池的数据源
    • JNDI - 使用 JNDI 实现的数据源
  • Mybatis 连接池提供了三种方式的配置:

    • 配置的位置:

      • 主配置文件中的DataSource标签,type属性就是表示采用何种连接池方法。

      • type 属性的取值:

        • POOLED - 采用传统的 javax.sql.DataSource 规范中的连接池,mybatis 中有针对性规范的实现

        • UNPOOLED - 采用传统的获取连接的方法,虽然也实现了 javax.sql.DataSource 接口,但是并没有使用 池 的思想。

        • JNDI - 采用服务器提供的 JDNI 技术实现,来获取 DataSource 对象,不同的服务器所能拿到的 DataSource 是不一样的。

          注意:如果不是 web 或者 maven 的 war 工程,是不能使用的。

          这里使用的 Tomcat 服务器,采用的连接池就是 dbcp 连接池。

2.2 Mybatis 中使用 unpooled 配置连接池的原理分析

  • 首先打开 JDBC 连接
  • 然后关闭 JDBC 中的事务的自动提交
  • 准备 sql 语句
  • 执行 SQL 语句然后返回结果
  • 最后关闭 JDBC 的连接

上面的步骤说明,如果在主配置文件中,将配置连接池信息的 type 类型设置为 unpooled, 那么每次使用都会创建一个新的连接:

<!--配置连接池-->
            <dataSource type="UNPOOLED">
                <property name="driver" value="${jdbc.driver}"></property>
                <property name="url" value="${jdbc.url}"></property>
                <property name="username" value="${jdbc.username}"></property>
                <property name="password" value="${jdbc.password}"></property>
            </dataSource>

在 Mybatis 内部分别定义实现了 javax.sql.DataSource 接口的 UnpooledDataSource, PooledDataSource 类表示 UNPOOLED、POOLED类型的数据源。

进入 UnpooledDataSource 类:

public class UnpooledDataSource implements DataSource {
   }

它(PooledDataSource类同样)实现了 DataSource 接口,而 DataSource 接口就是 javax.sql 的DataSource 也就是 jdbc 规范中的连接定义。其中也必定有一个方法,叫 getConnection。

然后,返回 UnpooledDataSource 类,寻找 getConnection 对象:

  @Override
  public Connection getConnection() throws SQLException {
   
    return doGetConnection(username, password);
  }

  @Override
  public Connection getConnection(String username, String password) throws SQLException {
   
    return doGetConnection(username, password);
  }

getConnection 方法在内部调用了 doGetConnection 方法,查看 doGetConnection 方法:

  private Connection doGetConnection(String username, String password) throws SQLException {
   
    Properties props = new Properties();
    if (driverProperties != null) {
   
      props.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值