一:Mybatis连接池
我们在学习WEB技术的时候肯定接触过许多连接池,比如C3P0、dbcp、druid,但是我们今天说的mybatis中也有连接池技术,可是它采用的是自己内部实现了一个连接池技术,我们可以在mybatis的SqlMapConfig.xml配置文件中,通过设置<dataSource type="POOLED">标签来实现mybatis中的连接池配置。
1:Mybatis连接池种类
我们可以把Mybatis连接池分为三类:
UNPOOLED :不使用连接池技术
POOLED :使用连接池技术
JNDI :使用JNDI实现数据源
Mybatis内部实现了java.sql.DataSource接口的UnpooledDataSource和PooledDataSource两个类分别来表示UNPOOLED、POOLED类型的数据源
从上图可以看出UnpooledDataSource和PooledDataSource两个类都实现了java.sql.DataSource接口,但注意的是PooledDataSource类里面会聚合一个UnpooledDataSource引用对象,因为PooledDataSource需要创建java.sql.Connection的连接数据库对象的时候,它是调用非连接池对象UnpooledDataSource来创建,说白了创建是UnpooledDataSource,而PooledDataSource只是提供了一个缓存连接池机制
所以我们在这三种数据源中,一般采用POOLED连接池技术,因为这个可以更好的管理数据源连接,防止来回创建浪费时间,而JNDI技术我会后期会单独抽时间写一篇博文,它主要是针对web架构的工程使用的连接池技术
2:Mybatis中的SqlMapConfig.xml配置数据源
<dataSource type="POOLED"> <!--四大配置 driver驱动 url数据库地址 username/password账号密码--> <property name="driver" value="${driver}"/> <property name="url" value="${url}"/> <property name="username" value="${username}"/> <property name="password" value="${password}"/> </dataSource> <!-- mybatis在初始化的时候会根据<dataSource>中的type属性来创建相应的数据源DataSource type="POOLED":MyBatis 会创建 PooledDataSource 实例 type="UNPOOLED" : MyBatis 会创建 UnpooledDataSource 实例 type="JNDI":MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用 我上面配置的是POOLED使用连接池数据源技术 -->
3:项目搭建
二:UNPOOLED无连接池原理分析
我们首先来把配置文件下的DataSource标签的type属性改为UNPOOLED不使用连接池数据源,然后运行一下测试类的update方法测试
可是现在好奇它的内部是什么样的呢?首先我说一下,其实Mybatis是通过工厂模式来创建数据源DataSource对象的,(注:这个工厂模式只实现UNPOOLED和JNDI两种)那个抽象工厂是:org.apache.ibatis.datasource.DataSourceFactory,它里面有2个抽象方法
#### org.apache.ibatis.datasource.DataSourceFactory 源码
import java.util.Properties; import javax.sql.DataSource; public interface DataSourceFactory { void setProperties(Properties props); //获取指定的数据源创建对象 DataSource getDataSource(); }
那我们这一节讲的是 不使用连接池UnpooledDataSource,其实DataSourceFactory下面有UnpooledDataSourceFactory实现子类
让我们进入它的实现类看看吧,然后就可以知道它是怎么返回数据源创建对象的
public class UnpooledDataSourceFactory implements DataSourceFactory { private static final String DRIVER_PROPERTY_PREFIX = "driver."; private static final int DRIVER_PROPERTY_PREFIX_LENGTH = DRIVER_PROPERTY_PREFIX.length(); //聚合的DataSource protected DataSource dataSource; //构造函数 public UnpooledDataSourceFactory() { //这不正是使用UnpooledDataSource的实例吗?没错就是 那应该也有返回这个实例的方法 this.dataSource = new UnpooledDataSource(); } ......此处省略一部分源码 //看啦 在这耶 这个就是返回去一个实例 可以看成是DataSource ds=new UnpooledDataSource() @Override public DataSource getDataSource() { return dataSource; } ...... 此处省略一部分代码 }