该系列文章针对 Mybatis 3.5.1 版本

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

本章重点来讲解一下 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 获取的相关代码如下:

代码的执行逻辑图如下:

2 数据源配置_[Mybatis]-[基础支持层]-数据源信息-数据源详解相关推荐

  1. sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析

    该系列文章针对 Mybatis 3.5.1 版本 Mybatis 中 标签解析,主要是为了得到两大部分数据 1.Mapper.class 接口 2.SQL 执行语句,结果集映射关系等数据 在上一章中提 ...

  2. idea打印sql的插件_[Mybatis]-[基础支持层]-插件-自定义简易SQL打印插件

    该系列文章针对 Mybatis 3.5.1 版本 在 mybatis 中允许针对 SQL 在执行前后进行扩展操作,而这些扩展操作也叫做插件. 在 Mybaits 中允许用插件来拦截的方法包括: Exe ...

  3. mybatis plugins_[Mybatis]-[基础支持层]-插件-plugin标签解析

    该系列文章针对 Mybatis 3.5.1 版本 一.Mybatis 插件的作用 Mybatis 针对 SQL 映射语句执行过程中进行拦截处理,而对应的拦截器 Mybaits 又称之为 插件(这些插件 ...

  4. 电脑主板跳线_电脑基础进阶必学知识,详解电脑主板跳线!

    在DIY装机时新手总会有不同的问题,虽然目前网上流传着各种版本的教学文章或者视频,但是细致的小技巧讲解还是有限,不少网友在装机的时候虽然大致明白各个硬件的组合,但是在跳线的环节可以难住了不少的人,也挡 ...

  5. MyBatis 架构分层与模块划分-基础支持层

    最后一个就是基础支持层.基础支持层主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能.比如数据源.缓存.日志.xml 解析.反射.IO.事务等等这些功能. 这个就是MyBatis 的 ...

  6. Java基础13:反射与注解详解

    Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...

  7. C++框架_之Qt的信号和槽的详解

    目录 C++_之Qt的信号和槽的详解 1.概述 1.1对象树(子对象动态分配空间不需要释放) 2.信号和槽 Qt5 的书写方式:(推荐的使用)★★★★★ Qt4 的书写方式: 3.自定义信号槽 3.1 ...

  8. basicdatasourcefactory mysql_Java基础-DBCP连接池(BasicDataSource类)详解

    Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中"获得连接"或"释放资源 ...

  9. Sniff网络基础原理和软件实现技巧详解

    Sniff网络基础原理和软件实现技巧详解 前言 SNIFF真是一个古老的话题,关于在网络上采用SNIFF来获取敏感信息已经不是什么新鲜事,也不乏很多成功的案例,那么,SNIFF究竟是什么呢? SNIF ...

最新文章

  1. 中兴同美司法部和解协议获准:罚12亿美元
  2. 2018年国内就业薪资高的7大编程语言排行
  3. java xml amp_Javaamp;Xml教程(十一)JAXB实现XML与Java对象转换
  4. W3c 中文 文档,很不错
  5. 旧版java_Java旧版本清理|JavaRa旧版本清理下载_V2.4 官方版_9号软件下载
  6. liunx服务器间拷贝文件,linux 不同服务器之间拷贝文件
  7. 揭秘黑石、橡树等巨头的不良资产赚钱术
  8. Java利用MessageDigest获取字符串或文件MD5详解
  9. mysql有if选择更新_使用IF条件的MySQL更新
  10. 智慧交管数字孪生IOC系统
  11. 【Jmeter】Jmeter java.lang.IllegalAccessError: class com.github.weisj.报错
  12. 嵌入式linux机械臂,一款基于ARM嵌入式的机械臂的设计与实现
  13. axure如何页面滑动时广告位上移_Axure实现滚动广告效果
  14. 如何将excel.xls文件批量转换成.xlsx格式
  15. PPT多张图片的融合插件
  16. HTTP、FTP状态码 汇总
  17. Android---TabLayout
  18. 国产NS32F103CBT6软硬件通用STM32F103CBT6
  19. Java计算机毕业设计大学生科研管理系统的设计与实现源码+系统+数据库+lw文档
  20. Google 早期三驾马车之 GFS 论文学习与研读

热门文章

  1. 有限自动机与有限状态机
  2. 计算机主要是以划分发展阶段的,计算机以什么划分发展阶段
  3. css3价格斜切_HTML5+CSS3价格表翻转切换动画
  4. android文本与布局
  5. Kotlin 条件控制(六)
  6. scala定义函数(六)
  7. 有关asp.net技术的外文文献_医学科技论文写作中参考文献的标准格式及常见问题...
  8. fscanf不读取_NCNN-Breakdown(3) 读取网络的proto信息
  9. JAVA中修改顺序表中的元素_在Java中修改列表的每个项目
  10. Timeline窗口详解