MyBatis内置DataSource的连接池实现原理

本文详细探讨了MyBatis内置DataSource的连接池实现原理,从JDBC操作数据库的常见步骤出发,阐述了数据库连接池的重要性和工作模式。接着,深入分析了MyBatis如何维护连接池,包括获取和释放连接的逻辑,以及如何通过代理模式实现连接的回收,以提高性能和减少资源消耗。
摘要由CSDN通过智能技术生成

前言

MyBatis是一个流行的ORM框架,它简单易用,支持自定义SQL、存储过程以及高级映射。MyBatis免除了几乎所有的JDBC代码以及设置参数和获取结果集的工作。
作为一款优秀的持久层框架,连接池是必不可少的。本文将分析MyBatis内置的数据源是如何实现连接池功能的(源码基于MyBatis3.4.5)。

JDBC对数据库的操作

回忆一下,我们用原生的JDBC来操作数据库的一般流程:

public class JDBCExample {
   
    // JDBC driver name and database URL / credentials
    static final String JDBC_DRIVER = "com.mysql.jdbc.Driver";
    static final String DB_URL = "jdbc:mysql://localhost/EMP";
    static final String USER = "username";
    static final String PASS = "password";

    public List<User> queryUsers() {
   
        Connection conn = null;
        Statement stmt = null;
        ResultSet rs = null;
        List<User> users = new ArrayList<>();
        try {
   
            // STEP 1: 注册driver
            Class.forName(JDBC_DRIVER);
            // STEP 2: 打开连接
            conn = DriverManager.getConnection(DB_URL,USER,PASS);
            // STEP 3: 执行query
            stmt = conn.createStatement();
            String sql = "SELECT ID, NAME, AGE FROM USER";
            rs = stmt.executeQuery(sql);
            // STEP 4: 获取变量
            while(rs.next()) {
   
                User user = new User();
                user.setId(rs.getInt("ID"));
                user.setAge(rs.getInt("AGE"));
                user.setName(rs.getString("NAME"));
                users.add(user);
            }
            return users;
        } catch(SQLException | ClassNotFoundException e) {
   
            e.printStackTrace();
        } finally {
   
            // STEP 5: 关闭资源
            try {
   
                if (rs != null)
                    rs.close();
                if (stmt != null)
                    stmt.close();
                if (conn != null)
                    conn.close();
            } catch(SQLException se) {
   
                se.printStackTrace();
            }
        }
        return users;
    }
}

主要的步骤包括:

  1. 加载数据库驱动
  2. 获取数据库连接
  3. 执行SQL语句
  4. ResultSet获取结果,给Entity赋值
  5. 关闭数据库连接等资源

不难发现,当中包含了大段的重复模版代码。而我们所关心的业务逻辑,只有寥寥几行。而且,每执行一次数据库操作都重新建立一个新的连接,用完之后关闭的做法,性能非常低。因为每次打开关闭连接,都会涉及到TCP的三次握手与四次挥手,以及数据库的验证操作。为了优化第二个问题,出现了数据库连接池

数据库连接池

不管是Connection PoolThread Pool还是Channel Pool,所有的思想都是一致的:

  • 维护一个资源集合
  • 消费者可以从集合中获取资源
  • 消费者使用完资源后,将之放回池中

当然其中肯定会涉及到一些池的大小的维护,池满之后的处理等细节操作。接下来我们来分析一下MyBatis中的连接池是如何实现的。

MyBatis中的连接池实现

如果我们使用MyBatis内置的数据源的化,一般会在XML配置文件里面这样配置:

<dataSource type="POOLED">
    <property name="driver" value="${driver}"/>
    <property name="url" value="${url}"/>
    <property name="username" value="${username}"/>
    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值