Mybatis的数据库连接池

本文介绍了Mybatis的数据库连接池,重点讲解了PooledDataSource和UnpooledDataSource的使用,以及连接的获取和释放过程,阐述了如何通过连接池提高性能。
摘要由CSDN通过智能技术生成

                Mybatis的数据库连接池

  我们都知道Mybatis是和数据库打交道的ORM框架,频繁的创建数据库连接对性能是有影响的,所以使用数据库连接池是非常有必要的。下面我们就Mybatis的DataSource做一些介绍。

一:Mybatis的datasource模块
  mybatis的数据库连接池采用工厂模式创建UnpooledDataSource和PooledDataSource。代码模块位于org.apache.ibatis.datasource包下面 。提供了jndi,pooled(有连接池),unpooled(不带连接池),这里只介绍pooled和unpooled。
在介绍之前我们先看看几个类:
  DataSourceFactory接口位于org.apache.ibatis.datasource包下,提供了设置DataSource属性和获取DataSource接口

package org.apache.ibatis.datasource;

import java.util.Properties;
import javax.sql.DataSource;

/**
 * @author Clinton Begin
 */
public interface DataSourceFactory {
   

  //设置DataSource的相关属性
  void setProperties(Properties props);

  //获取数据源
  DataSource getDataSource();

}

UnpooledDataSource:实现了DataSource接口主要是创建没有连接池的数据库连接。和我们通过JDBC创建连接类似。

public class UnpooledDataSource implements DataSource {
   
  
  private ClassLoader driverClassLoader;//驱动类的类加载器
  private Properties driverProperties;//数据库连接相关配置信息
  private static Map<String, Driver> registeredDrivers = new ConcurrentHashMap<>();//缓存已注册的数据库驱动类

  private String driver;
  private String url;
  private String username;
  private String password;

  private Boolean autoCommit;//是否自动提交
  private Integer defaultTransactionIsolationLevel;//事务隔离级别

  PooledDataSource实现了DataSource接口,定义了很多数据库连接池参数

//使用连接池的数据源
public class PooledDataSource implements DataSource {
   

  private static final Log log = LogFactory.getLog(PooledDataSource.class);

  private final PoolState state = new PoolState(this);

  //真正用于创建连接的数据源
  private final UnpooledDataSource dataSource;

  // OPTIONAL CONFIGURATION FIELDS
  //最大活跃连接数
  protected int poolMaximumActiveConnections = 10;
  //最大闲置连接数
  protected int poolMaximumIdleConnections = 5;
  //最大checkout时长(最长使用时间)
  protected int poolMaximumCheckoutTime = 20000;
  //无法取得连接是最大的等待时间
  protected int poolTimeToWait = 20000;
  //最多允许几次无效连接
  protected int poolMaximumLocalBadConnectionTolerance = 3;
  //测试连接是否有效的sql语句
  protected String poolPingQuery = "NO PING QUERY SET";
  //是否允许测试连接
  protected boolean poolPingEnabled;
  //配置一段时间,当连接在这段时间内没有被使用,才允许测试连接是否有效
  protected int poolPingConnectionsNotUsedFor;
  //根据数据库url、用户名、密码生成一个hash值,唯一标识一个连接池,由这个连接池生成的连接都会带上这个值
  private int expectedConnectionTypeCode;

  PooledConnection:用来创建连接,通过动态代理对连接进行增强(连接前检查是否有效)

package org.apache.ibatis.datasource.pooled;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.sql.Connection;
import java.sql.SQLException;

import org.apache.ibatis.reflection.ExceptionUtil;

/**
 * 使用动态代理封装了真正的数据库连接对象
 * @author Clinton Begin
 */
//
class PooledConnection imple
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值