[Mybatis]-[基础支持层]-数据源信息-数据源详解

该系列文章针对 Mybatis 3.5.1 版本

在上一篇文章中,谈到了 <environment> 标签解析会构建 Environment 对象,Environment 对象中有两个关键属性对象:TransactionFactory 和 DataSource 。

本章重点来讲解一下 DataSource 相关实现类

一、回顾

首先来回顾一下 XMLConfigBuilder 中构建 DataSource 的相关代码,如下图:

通过读取配置文件 <dataSource type="xx" 中的 type 值,该值对应的 TypeAliasRegistry 中 HashMap 的 key值。

通过 key 值获取 class 文件,然后通过反射实例化相关的数据源工厂。

而在 Mybatis 默认的数据源工厂有三个,如下:

  • JndiDataSourceFactory

  • PooledDataSourceFactory

  • UnpooledDataSourceFactory

二、数据源工厂及数据源介绍

2.1、JndiDataSourceFactory

JNDI(Java Naming and Directory Interface):Java命名与语录接口。J2EE 规范之一。
JNDI 和 配置文件的作用一样,JNDI 的作用就是把代码中的硬编码写到如:tomcat 之类的容器配置中,代码直接配置这些配置在哪里即可。然后通过配置文件,构建对象。

相关代码如下

通过配置拉取数据源配置信息,构建 DataSource 数据源。

而这些数据源的配置通常是配置在 tomcat 等容器的配置类中。

2.2、 UnpooledDataSourceFactory 和 PooledDataSourceFactory

UnpooledDataSourceFactory 和 PooledDataSourceFactory 工厂的处理流程是一致的,不同点在于返回的数据源不一样。来看一下 PooledDataSourceFactory 代码,如下图:

UnpooledDataSourceFactory 工厂返回的是 UnpooledDataSource,PooledDataSourceFactory 工厂返回的是 PooledDataSource。

下面通过 UnpooledDataSourceFactory 分析数据源工厂的相关代码操作。

UnpooledDataSourceFactory 工厂是用来获取 UnpooledDataSource 数据源对象的工厂类。

先来看看 UnpooledDataSourceFactory 部分代码实现,如下图:

如上图所示,获取 UnpooledDataSource 对象需要遵循步骤

1、调用构造函数实例化 UnpooledDataSourceFactory 对象
2、调用 UnpooledDataSourceFactory#setProperties 方法,为 工厂中的 UnpooledDataSource 设置属性(如:url,username,password)
3、调用 UnpooledDataSourceFactory#getDataSource 获取数据源 UnpooledDataSource

小贴士:通过工厂 UnpooledDataSourceFactory 能够知道 UnpooledDataSource 是一个单例,从工厂获取到的总是同一个对象

而 在 Mybatis 中完成工厂的实例化到数据源对象的获取都是在 XMLConfigBuilder 解析 <environment> 标签构建 Environment 时完成,相关构建代码如下:

UnpooledDataSourceFactory 和 PooledDataSourceFactory 返回数据源的操作是一样的,区别就在于数据源本身

PooledDataSource 数据源中针对连接的建立进行了池化,实现链接的复用,减少每次建立连接的资源消耗。

UnpooledDataSource 数据源每次链接的获取都需要创建一个新的。

PooledDataSource 是在 UnpooledDataSource 基础上进行池化操作,UnpooledDataSource 的实现也更简单,首先先来分析 UnpooledDataSource。

2.2.1、 UnpooledDataSource

数据源 DataSource 是用来获取与数据库的连接对象 Connection ,然后代码执行数据操作,所以需要关注的是数据库连接 Connection 的获取。

UnpooledDataSource 获取 connection 的相关代码如下:

整个操作主要分为三个步骤:

1、初始化数据库驱动

这里会存在一个数据库驱动的缓存,为了防止每次创建连接时都创建新的数据库驱动
2、建立数据连接
3、设置链接事务提交以及事务隔离级别

2.2.2、 PooledDataSource

PooledDataSource 是在 UnpooledDataSource 基础上实现池化的,对此 Mybatis 提供了两个对象用以辅助池化的构建。分别是

  • PoolState

PoolState 关键代码如下:

PoolState 存储了当前空闲和活跃的连接对象,以及相关的链接操作统计数据

  • PooledConnection

PooledConnection 关键代码如下:

针对原始的 Connection 进行包装,提供了相关操作数据便于统计和操作,同时提供了原始链接 Connection 的代理对象,在进行原生 Connection 操作前进行相关操作,如数据源关闭后的资源回收操作。

PooledDataSource 关于 Connection 获取的相关代码如下:

代码的执行逻辑图如下:


文章实时更新,关注公众号

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页