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