2 数据源配置_[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
获取的相关代码如下:
代码的执行逻辑图如下:
2 数据源配置_[Mybatis]-[基础支持层]-数据源信息-数据源详解相关推荐
- sql server解析xml属性为表格_[Mybatis][基础支持层]mapper xml sql 解析
该系列文章针对 Mybatis 3.5.1 版本 Mybatis 中 标签解析,主要是为了得到两大部分数据 1.Mapper.class 接口 2.SQL 执行语句,结果集映射关系等数据 在上一章中提 ...
- idea打印sql的插件_[Mybatis]-[基础支持层]-插件-自定义简易SQL打印插件
该系列文章针对 Mybatis 3.5.1 版本 在 mybatis 中允许针对 SQL 在执行前后进行扩展操作,而这些扩展操作也叫做插件. 在 Mybaits 中允许用插件来拦截的方法包括: Exe ...
- mybatis plugins_[Mybatis]-[基础支持层]-插件-plugin标签解析
该系列文章针对 Mybatis 3.5.1 版本 一.Mybatis 插件的作用 Mybatis 针对 SQL 映射语句执行过程中进行拦截处理,而对应的拦截器 Mybaits 又称之为 插件(这些插件 ...
- 电脑主板跳线_电脑基础进阶必学知识,详解电脑主板跳线!
在DIY装机时新手总会有不同的问题,虽然目前网上流传着各种版本的教学文章或者视频,但是细致的小技巧讲解还是有限,不少网友在装机的时候虽然大致明白各个硬件的组合,但是在跳线的环节可以难住了不少的人,也挡 ...
- MyBatis 架构分层与模块划分-基础支持层
最后一个就是基础支持层.基础支持层主要是一些抽取出来的通用的功能(实现复用),用来支持核心处理层的功能.比如数据源.缓存.日志.xml 解析.反射.IO.事务等等这些功能. 这个就是MyBatis 的 ...
- Java基础13:反射与注解详解
Java基础13:反射与注解详解 什么是反射? 反射(Reflection)是Java 程序开发语言的特征之一,它允许运行中的 Java 程序获取自身的信息,并且可以操作类或对象的内部属性. Orac ...
- C++框架_之Qt的信号和槽的详解
目录 C++_之Qt的信号和槽的详解 1.概述 1.1对象树(子对象动态分配空间不需要释放) 2.信号和槽 Qt5 的书写方式:(推荐的使用)★★★★★ Qt4 的书写方式: 3.自定义信号槽 3.1 ...
- basicdatasourcefactory mysql_Java基础-DBCP连接池(BasicDataSource类)详解
Java基础-DBCP连接池(BasicDataSource类)详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 实际开发中"获得连接"或"释放资源 ...
- Sniff网络基础原理和软件实现技巧详解
Sniff网络基础原理和软件实现技巧详解 前言 SNIFF真是一个古老的话题,关于在网络上采用SNIFF来获取敏感信息已经不是什么新鲜事,也不乏很多成功的案例,那么,SNIFF究竟是什么呢? SNIF ...
最新文章
- 中兴同美司法部和解协议获准:罚12亿美元
- 2018年国内就业薪资高的7大编程语言排行
- java xml amp_Javaamp;Xml教程(十一)JAXB实现XML与Java对象转换
- W3c 中文 文档,很不错
- 旧版java_Java旧版本清理|JavaRa旧版本清理下载_V2.4 官方版_9号软件下载
- liunx服务器间拷贝文件,linux 不同服务器之间拷贝文件
- 揭秘黑石、橡树等巨头的不良资产赚钱术
- Java利用MessageDigest获取字符串或文件MD5详解
- mysql有if选择更新_使用IF条件的MySQL更新
- 智慧交管数字孪生IOC系统
- 【Jmeter】Jmeter java.lang.IllegalAccessError: class com.github.weisj.报错
- 嵌入式linux机械臂,一款基于ARM嵌入式的机械臂的设计与实现
- axure如何页面滑动时广告位上移_Axure实现滚动广告效果
- 如何将excel.xls文件批量转换成.xlsx格式
- PPT多张图片的融合插件
- HTTP、FTP状态码 汇总
- Android---TabLayout
- 国产NS32F103CBT6软硬件通用STM32F103CBT6
- Java计算机毕业设计大学生科研管理系统的设计与实现源码+系统+数据库+lw文档
- Google 早期三驾马车之 GFS 论文学习与研读
热门文章
- 有限自动机与有限状态机
- 计算机主要是以划分发展阶段的,计算机以什么划分发展阶段
- css3价格斜切_HTML5+CSS3价格表翻转切换动画
- android文本与布局
- Kotlin 条件控制(六)
- scala定义函数(六)
- 有关asp.net技术的外文文献_医学科技论文写作中参考文献的标准格式及常见问题...
- fscanf不读取_NCNN-Breakdown(3) 读取网络的proto信息
- JAVA中修改顺序表中的元素_在Java中修改列表的每个项目
- Timeline窗口详解