文章目录
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.