一: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类型的数据源

Mybatis连接池及事务

从上图可以看出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:项目搭建

快速搭建一个Mybatis小框架

二:UNPOOLED无连接池原理分析

我们首先来把配置文件下的DataSource标签的type属性改为UNPOOLED不使用连接池数据源,然后运行一下测试类的update方法测试

Mybatis连接池及事务

 可是现在好奇它的内部是什么样的呢?首先我说一下,其实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实现子类

Mybatis连接池及事务

 让我们进入它的实现类看看吧,然后就可以知道它是怎么返回数据源创建对象的

Mybatis连接池及事务
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;
  }
 ...... 此处省略一部分代码
}
UnpooledDataSourceFactory源码分析

相关文章:

  • 2021-04-23
  • 2021-05-01
  • 2021-07-11
  • 2021-10-14
  • 2022-12-23
  • 2021-05-25
  • 2021-05-13
猜你喜欢
  • 2021-09-29
  • 2021-12-20
  • 2021-08-20
  • 2022-01-25
  • 2021-05-03
  • 2021-10-25
  • 2022-12-23
相关资源
相似解决方案