、Mybatis 的连接池技术

我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自
己的连接池技术。在 Mybatis 的 SqlMapConfig.xml 配置文件中,通过<dataSource type=”pooled”>来实
现 Mybatis 中连接池的配置。

1.Mybatis 数据源的分类

可以看出 Mybatis 将它自己的数据源分为三类:
UNPOOLED 不使用连接池的数据源
POOLED 使用连接池的数据源
JNDI 使用 JNDI 实现的数据源
具体结构如下:

相应地,MyBatis 内部分别定义了实现了 java.sql.DataSource 接口的 UnpooledDataSource,
PooledDataSource 类来表示 UNPOOLED、POOLED 类型的数据源。
在这三种数据源中,我们一般采用的是 POOLED 数据源(很多时候我们所说的数据源就是为了更好的管理数据
库连接,也就是我们所说的连接池技术)。

2.SqlMapConfig.xml 中数据源的配置

<!-- 配置数据源(连接池)信息 -->
<dataSource type="POOLED"> <property name="driver" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</dataSource>
MyBatis 在初始化时,根据<dataSource>的 type 属性来创建相应类型的的数据源 DataSource,即:
type=”POOLED”:MyBatis 会创建 PooledDataSource 实例
type=”UNPOOLED” : MyBatis 会创建 UnpooledDataSource 实例
type=”JNDI”:MyBatis 会从 JNDI 服务上查找 DataSource 实例,然后返回使用

3.Mybatis DataSource 的存取

MyBatis 是 通 过 工 厂 模 式 来 创 建 数 据 源 DataSource 对 象 的 , MyBatis 定 义 了 抽 象 的 工 厂 接
口:org.apache.ibatis.datasource.DataSourceFactory,通过其 getDataSource()方法返回数据源DataSource。
下面是 DataSourceFactory 源码,具体如下:
package org.apache.ibatis.datasource;
import java.util.Properties;
import javax.sql.DataSource;
/**
* @author Clinton Begin
*/
public interface DataSourceFactory {void setProperties(Properties props);DataSource getDataSource();
}
MyBatis 创建了 DataSource 实例后,会将其放到 Configuration 对象内的 Environment 对象中, 供以后使用。
具体分析过程如下:
a.先进入 XMLConfigBuilder 类中,可以找到如下代码:
b.分析 configuration 对象的 environment 属性,结果如下:

4.Mybatis 中连接的获取过程分析

当我们需要创建 SqlSession 对象并需要执行 SQL 语句时,这时候 MyBatis 才会去调用 dataSource 对象
来创建java.sql.Connection对象。也就是说,java.sql.Connection对象的创建一直延迟到执行SQL语句
的时候。
@Test
public void testSql() throws Exception {
InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
SqlSession sqlSession = factory.openSession();
List<User> list = sqlSession.selectList("findUserById",41);
System.out.println(list.size());
}
只有当第 4 句 sqlSession.selectList("findUserById"),才会触发 MyBatis 在底层执行下面这个方
法来创建 java.sql.Connection 对象。
如何证明它的加载过程呢?
我们可以通过断点调试,在 PooledDataSource 中找到如下 popConnection()方法,如下所示:
分析源代码,得出 PooledDataSource 工作原理如下:

下面是连接获取的源代码:
最后我们可以发现,真正连接打开的时间点,只是在我们执行SQL语句时,才会进行。其实这样做我们也可以
进一步发现,数据库连接是我们最为宝贵的资源,只有在要用到的时候,才去获取并打开连接,当我们用完了就再
立即将数据库连接归还到连接池中。

二、Mybatis 的事务控制

1.JDBC 中事务的回顾

在 JDBC 中我们可以通过手动方式将事务的提交改为手动方式,通过 setAutoCommit()方法就可以调整。
通过 JDK 文档,我们找到该方法如下:
那么我们的 Mybatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的
setAutoCommit()方法来设置事务提交方式的。

2.Mybatis 中事务提交方式

Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制。

 @Testpublic void testSave() {User user = new User();user.setUserName("小王 新");user.setAddress("北京市顺义区");user.setSex("男");user.setBirthday(new Date(System.currentTimeMillis()));System.out.println("保存操作之前:" + user);//5.执行保存方法userDao.saveUser(user);System.out.println("保存操作之后:" + user);}

这是我们的 Connection 的整个变化过程,通过分析我们能够发现之前的 CUD 操作过程中,我们都要手动进
行事务的提交,原因是 setAutoCommit()方法,在执行时它的值被设置为 false 了,所以我们在 CUD 操作中,
必须通过 sqlSession.commit()方法来执行提交操作。

3.Mybatis 自动提交事务的设置

通过上面的研究和分析,现在我们一起思考,为什么 CUD 过程中必须使用 sqlSession.commit()提交事
务?主要原因就是在连接池中取出的连接,都会将调用 connection.setAutoCommit(false)方法,这样我们
就必须使用 sqlSession.commit()方法,相当于使用了 JDBC 中的 connection.commit()方法实现事务提
交。
明白这一点后,我们现在一起尝试不进行手动提交,一样实现 CUD 操作。
@Before//在测试方法执行之前执行
public void init() throws Exception {//1.读取配置文件in = Resources.getResourceAsStream("SqlMapConfig.xml");//2.创建构建者对象SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();//3.创建 SqlSession 工厂对象factory = builder.build(in);//4.创建 SqlSession 对象  session = factory.openSession(true);//5.创建 Dao 的代理对象userDao = session.getMapper(IUserDao.class);
}@After//在测试方法执行完成之后执行
public void destroy() throws Exception {//session.commit();//7.释放资源session.close();in.close();
}

所对应的 DefaultSqlSessionFactory 类的源代码:
运行测试保存方法,结果如下
我们发现,此时事务就设置为自动提交了,同样可以实现CUD操作时记录的保存。虽然这也是一种方式,但就
编程而言,设置为自动提交方式为 false 再根据情况决定是否进行提交,这种方式更常用。因为我们可以根据业务
情况来决定提交是否进行提交。

7-Mybatis 连接池与事务深入相关推荐

  1. java day55【 Mybatis 连接池与事务深入 、 Mybatis 的动态 SQL 语句、 Mybatis 多表查询之一对多 、 Mybatis 多表查询之多对多】...

    第1章 Mybatis 连接池与事务深入 1.1 Mybatis 的连接池技术 1.1.1 Mybatis 连接池的分类 1.1.2 Mybatis 中数据源的配置 1.1.3 Mybatis 中 D ...

  2. mybatis连接池的3种配置方式(POOLED,UNPOOLED,JNDI)

    mybatis连接池的3种配置方式 1,POOLED 采用传统的javax. sql. DataSource规范中的连接池.一旦数据库操作完成,mybaties会将此连接返回给连接池.mybatis有 ...

  3. MySQL会回收使用中的连接吗_Node.js实现mysql连接池使用事务自动回收连接的方法示例...

    本文实例讲述了Node.js实现mysql连接池使用事务自动回收连接的方法.分享给大家供大家参考,具体如下: var mysql = require('mysql'), Connection = re ...

  4. Mybatis 连接池POOLED

    1.连接池: 我们在实际开发中都会使用连接池. 因为它可以减少我们获取连接所消耗的时间. 2.mybatis中的连接池 在 Mybatis 中也有连接池技术,但是它采用的是自己的连接池技术. 在 My ...

  5. Mybatis连接池介绍与分类 Mybatis使用POOLED UNPOOLED配置连接池的原理分析

    一.连接池 1.概念:其实就是一个容器(集合),存放数据库连接的容器. 当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象 ...

  6. mybatis学习(四)连接池、事务、动态SQL、多表查询

    目录 连接池 事务 动态SQL 1.if标签 2.where标签 3.foreach标签 4.sql标签 多表操作 (一)一对多.多对一 .一对一 1.查询所有账户,在账户信息后显示所属的用户的用户名 ...

  7. day_03_连接池、事务、一对多和多对多配置

    一.完成连接池的配置和使用 1.连接池 创建一个java.sql.Connection对象的代价是如此巨大,是因为创建一个Connection对象的过程,在底层就相当于和数据库建立的通信连接,在建立通 ...

  8. mybatis 连接池_应用框架之Mybatis数据源和连接池

    本文将从以下几个方面介绍Mybatis的数据源和连接池: MyBatis数据源DataSource分类 数据源DataSource的创建过程 DataSource什么时候创建Connection对象 ...

  9. 【Java从0到架构师】MyBatis - 连接池、分页_PageHelper

    连接池.分页 集成 druid 连接池 读取外部的配置文件 分页查询 - PageHelper PageHelper 环境配置 PageHelper 使用方法 Java 从 0 到架构师目录:[Jav ...

最新文章

  1. 如何巧用方位角和倾斜角增大光伏电站的发电量?
  2. 分布式文件系统Fastdfs 详细安装笔记
  3. Java纸牌拖拉机简单模拟
  4. Little Sub and Applese
  5. Java趣味分享:try/finally
  6. Docker使用Dockerfile创建Centos(tomcat+jdk)镜像
  7. 每天一个linux命令
  8. java 数据流 中文_【Java I/O流】File、字符集、字节流、字符流、缓冲流、数据流、对象流、序列化、try-wi...
  9. 陆振波的svm的matlab代码的解释,陆振波SVM的MATLAB代码解释
  10. linux设置伪静态地址,wordpress网站linux和win主机URL伪静态设置方法详解
  11. 学习GIT的一个小游戏
  12. PC端微信更新至3.7.0版文件保存至MsgAttach文件夹乱码问题解决
  13. L'Hospital法则
  14. 【C++】黑马程序员 C++学习课程—C++基础入门
  15. Cherry键盘-windows键-没反应
  16. opensuse安装face_recognition全记录
  17. 个人博客添加网易云音乐Flash插件
  18. 智慧城市,是城市建设者做的最灿烂的事
  19. FL Studio20.8完整版注册密钥下载有哪些新功能?
  20. python循环语句和跳出语句详解

热门文章

  1. 【Spark】Spark Class is not registered joins UnsafeHashedRelation kryo
  2. 95-40-050-java.util.concurrent-CopyOnWriteArraySet
  3. 【clickhouse】clickhouse 如何实现tcp方式发送数据
  4. 【面试题】HashMap 面试 21 问
  5. 【Linux】Linux下 CURL如何发送http请求
  6. 【kafka】记一次线上kafka一直rebalance故障 消费慢 数据积压
  7. Unsupported major.minor version 52.0解决办法
  8. ListView的性能优化之convertView和viewHolder
  9. 18张图,详解SpringBoot解析yml全流程
  10. 分布式定时任务框架选型,写得太好了!