MyBatis连接池的实现原理分析

本文探讨了连接池技术,解释了为何使用连接池以提高程序性能,并介绍了MyBatis内置的连接池类型,包括POOLED、UNPOOLED和JNDI。重点解析了MyBatis中PooledDataSource的工作机制,如popConnection和pushConnection方法,以及连接池的活跃连接管理策略。此外,提到了连接池的大小限制为10。
摘要由CSDN通过智能技术生成

1. 连接池技术

  1. 连接池是什么:存储连接的容器

  2. 解决了什么问题 :如果没有连接池,那么每次都执行SQL语句都会创建connection连接,会浪费时间。影响 程序的性能。

  3. 提前创建一些连接,存储到连接池中,使用的时候从连接池中获取连接即可。

  4. 常用的连接池
    1. C3P0连接池
    2. DBCP连接池
    3. Druid连接池(阿里)

  5. 连接池有归还的操作,已经对close方法进行了增强,原来是销毁,现在是归还操作。

2. MyBatis连接池的分类

  1. MyBatis内置了连接池技术,dataSource标签的type属性有3个取值
    在这里插入图片描述
  2. POOLED使用连接池
  3. UNPOOLED 不使用连接池(这个了解即可,一般是不使用的)
  4. JNDI 使用JNDI实现连接池(麻烦,不推荐使用)

3. MyBatis连接池的实现原理分析

  1. 在解析配置文件的时候,创建dataSource对象,存入到Environment对象中。
  2. 当执行SQL语句的时候,准备从dataSource对象中获取链接。
  3. PooledDataSource源码中的2个方法用来获取连接和归还连接
    (1)、popConnection方法用来获取链接
  1. 先判断空闲的连接池中是否存在连接,如果存在,则获取一个连接使用。
  2. 查看活动状态的PooledConnection池activeConnections是否已满;如果没有满,则 创建一个新的 PooledConnection对象,然后放到activeConnections池中,然后返回此PooledConnection对 象。
  3. 看最先进入activeConnections池中的PooledConnection对象是否已经过期:如果已 经过期,从 activeConnections池中移除此对象,然后创建一个新的PooledConnection对象,添加 到activeConnections中,然后将此对象返回。

(2)、 pushConnection方法用来归还链接

两个方法的源码如下(参考):

  protected void pushConnection(PooledConnection conn) throws SQLException {
   

    synchronized (state) {
   
      state.activeConnections.remove(conn);
      if (conn.isValid()) {
   
        if (state.idleConnections.size() < poolMaximumIdleConnections && conn.getConnectionTypeCode() == expectedConnectionTypeCode) {
   
          state.accumulatedCheckoutTime += conn.getCheckoutTime();
          if (!conn.getRealConnection().getAutoCommit()) {
   
            conn.getRealConnection().rollback();
          }
          PooledConnection newConn = new PooledConnection(conn.getRealConnection(), this);
          state.idleConnections.add(newConn);
          newConn.setCreatedTimestamp(conn.getCreatedTimestamp());
          newConn.setLastUsedTimestamp(conn.getLastUsedTimestamp());
          conn.invalidate();
          if (log.isDebugEnabled()) {
   
            log.debug("Returned connection " + newConn.getRealHashCode() + " to pool.")
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值