【MyBatis】MyBatis 连接池和事务控制
MyBatis 连接池和事务控制
MyBaits 连接池
实际开发中都会使用连接池,因为它可以减少获取连接所消耗的时间。具体可查看
MyBatis 数据源配置在 SqlMapConfig.xml 中的 dataSource 标签,type 属性就是表示采用何种方式,它提供了三种方式的配置:
- POOLED 采用传统的
javax.sql.DataSource接口中的连接池,MyBatis中有针对此接口的实现 - UNPOOLED 采用传统的获取连接的方式,虽然也实现
javax.sql.DataSource接口,但是并没有使用池的思想 - JNDI 采用服务器提供的 JNDI 技术实现,来获取 DataSource 对象,不同的服务器所能拿到 DataSource 是不一样的。值得注意的是,如果不是 web 或者 maven 的 war 工程,是不能使用的。例如 Tomcat 服务器采用连接池就是DBCP。
POOLED 分析
连接池就是用于存储连接的一个容器,即一个集合对象,该集合必须是线程安全的,不能两个线程拿到同一个连接。而且,该集合还必须实现队列先进先出的特性。
运行测试程序,得到:

可以看到,先得到了一个连接,然后使用完成后,又将连接放回了连接池中。
源码分析:

由上图可以看到,一共有两个连接池,即 idleConnections 空闲池 和 activeConnections 活动池。
- 第一步:如果空闲池还有连接的话,直接从中取出一个拿出来使用,否则
- 第二步:查看活动池是否达到了最大数量,如果没有,则创建一个连接放入活动池,否则
- 第三步:从活动池取出一个最老的连接出来
UNPOOLED 分析
运行测试程序,得到:

可以看到,并没有连接池的概念。
JNDI 分析
JNDI(Java Nameing and Directory),即 Java 命名和目录接口,它提供了一个接口让用户在不知道资源所在位置的情形下,取得该资源服务。
使用步骤:
建立 Maven 工程,选择 archetype-webapp
手动添加 java resources test 等文件夹
在 webapp 目录下添加 META-INF.context.xml
<?xml version="1.0" encoding="UTF-8"?>
<Context>
<!--
<Resource
name="jdbc/mybatisT" 数据源的名称
type="javax.sql.DataSource" 数据源类型
auth="Container" 数据源提供者
maxActive="20" 最大活动数
maxWait="10000" 最大等待时间
maxIdle="5" 最大空闲数
username="root" 用户名
password="root" 密码
driverClassName="com.mysql.jdbc.Driver" 驱动类
url="jdbc:mysql://localhost:3306/mybatisT?useSSL=false" 连接url字符串
/>
-->
<Resource
name="jdbc/mybatisT"
type="javax.sql.DataSource"
auth="Container"
maxActive="20"
maxWait="10000"
maxIdle="5"
username="root"
password="root"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/mybatisT?useSSL=false"
/>
</Context>
配置 SqlMapConfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd"> <configuration>
<typeAliases>
<package name="cn.parzulpan.domain"/>
</typeAliases>
<environments default="mysql">
<environment id="mysql">
<!-- 配置事务控制的方式 -->
<transactionManager type="JDBC"/>
<!-- 配置连接数据库的必备信息 type属性表示是否使用数据源(连接池)-->
<dataSource type="JNDI">
<property name="data_source" value="java:comp/env/jdbc/mybatisT"/>
</dataSource>
</environment>
</environments> <!-- 指定mapper配置文件的位置 -->
<mappers>
<package name="cn.parzulpan.dao"/>
</mappers>
</configuration>
编辑 index.jsp,部署 Tomcat
<%@ page import="java.io.InputStream" %>
<%@ page import="org.apache.ibatis.io.Resources" %>
<%@ page import="org.apache.ibatis.session.SqlSessionFactoryBuilder" %>
<%@ page import="org.apache.ibatis.session.SqlSessionFactory" %>
<%@ page import="org.apache.ibatis.session.SqlSession" %>
<%@ page import="cn.parzulpan.dao.UserDAO" %>
<%@ page import="cn.parzulpan.domain.User" %>
<%@ page import="java.util.List" %>
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
<html>
<body>
<h2>Hello World!</h2>
<%
// 1. 读取配置文件
InputStream is = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2. 创建 SqlSessionFactory 的构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3. 使用构建者创建工厂对象 SqlSessionFactory
SqlSessionFactory factory = builder.build(is);
// 4. 使用 SqlSessionFactory 生产 SqlSession 对象
SqlSession sqlSession = factory.openSession();
// 5. 使用 SqlSession 对象 创建 DAO 接口的的代理对象
UserDAO userDAO = sqlSession.getMapper(UserDAO.class);
// 6. 使用代理对象执行方法
List<User> users = userDAO.findAll();
for (User user : users) {
System.out.println(user);
}
// 7. 释放资源
sqlSession.close();
is.close();
%>
</body>
</html>
MyBatis 事务控制
在 JDBC 中我们可以通过手动方式将事务的提交改为手动方式,通过 setAutoCommit() 方法就可以调整。
MyBatis 框架因为是对 JDBC 的封装,所以 Mybatis 框架的事务控制方式,本身也是用 JDBC 的 setAutoCommit() 方法来设置事务提交方式的。
public class Test {
private InputStream is;
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
private SqlSessionFactory factory;
private SqlSession session;
private UserDAO userDAO;
@Before
public void init() throws IOException {
is = Resources.getResourceAsStream("SqlMapConfig.xml");
factory = builder.build(is);
session = factory.openSession();
userDAO = session.getMapper(UserDAO.class);
}
@After
public void destroy() throws IOException {
session.commit(); // 事务提交
session.close();
is.close();
}
}
其实也可以采取非手动方式,openSession() 有一个可以设置是否自动提交的方法 SqlSession openSession(boolean autoCommit); 。
public class MyBatisCRUDTest {
private InputStream is;
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
private SqlSessionFactory factory;
private SqlSession session;
private UserDAO userDAO;
@Before
public void init() throws IOException {
is = Resources.getResourceAsStream("SqlMapConfig.xml");
factory = builder.build(is);
session = factory.openSession(true);
userDAO = session.getMapper(UserDAO.class);
}
@After
public void destroy() throws IOException {
// session.commit(); // 事务提交
session.close();
is.close();
}
}
但就编程而言,设置为自动提交方式为 false 再根据情况决定是否进行提交,这种方式更常用。因为可以根据业务情况来决定提交是否进行提交。
练习和总结
什么是事务?
事务的四大特性?
不考虑隔离性会产生的问题?
四种隔离级别?
【MyBatis】MyBatis 连接池和事务控制的更多相关文章
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置
在实际的开发中,建议使用连接池的形式. JNDI的资料 H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\讲义+笔记+资料\主流框架\31.会员版(2.0)-就业课(2. ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_3 mybatis连接池的分类
2.mybatis中的连接池 mybatis连接池提供了3种方式的配置: 配置的位置: 主配置文件SqlMapConfig.xml中的dataSourc ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_5 mybatis中使用poolead配置连接的原理分析
idelConnection是空闲的链接 idelConnection就是ArrayList的数组 如果没有空闲的就new一个 新的connection 一个空闲池,一个活动的池,一个链接过来.空闲池 ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析
把之前的CRUD的代码src下的代码都复制过来 依赖项也都复制过来, 配置文件 整理一番 执行findAll方法的测试 查看日志的输出部分 修改程序池 再来执行findAll方法 Plooled从连接 ...
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_2 连接池介绍
- 阶段3 1.Mybatis_07.Mybatis的连接池及事务_1 今日课程内容介绍
- MyBatis基础_连接池与事务、动态SQL、注解开发
一.MyBatis连接池及事务控制 1.连接池 在实际开发中,都会使用连接池,因为它可以减少获取连接缩消耗的时间.所谓连接池,就是存储数据库连接的容器.连接池中存储一定数量的数据库连接,当线程需要使用 ...
- Mybatis 的连接池技术
我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自 己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文件中,通 ...
- Spring Boot1.5.4 连接池 和 事务
原文:https://github.com/x113773/testall/issues/10 默认连接池---spring Boot中默认支持的连接池有Tomcat.HikariCP .DBCP . ...
随机推荐
- angular 双向数据绑定与vue数据的双向数据绑定
二者都是 MVVM 模式开发的典型代表 angular 是通过脏检测实现,angular 会将 UI 事件,请求事件,settimeout 这类延迟的对象放入到事件监测的脏队列,当数据变化的时候,触发 ...
- 笔记-Cats Transport<已写题解>
笔记-Cats Transport Cats Transport 令 \(D_i=\sum_{j=1}^id_i\),\(T_i=t_i-D_{h_i}\). 为 \(T_i\) 从小到大排序,令 \ ...
- TortoiseGit和intellij idea配置秘钥
第一:intellij idea 配置gitlab ssh key 1:打开git bash,不需要进入任何目录,直接输入 ssh-keygen -t rsa 一路回车 2:生成之后找到秘钥文件id_ ...
- C++ 纯虚函数与抽象类——virtual 和纯说明符 “=0”
什么时候使用纯虚函数 某些类,在现实角度和项目角度都不需要实例化(不需要创建它的对象),这个类中定义的某些成员函数只是为了提供一个形式上的接口,准备上子类来做具体的实现.此时这个方法就可以定义为&qu ...
- react中对内容点击复制
在react中一个标签内,点击这个标签直接复制标签内的内容 如图,我的需求是点击id这个标签实现对id的一键复制,所以请看copyHander函数 先创建一个Range对象,Range 对象表示文档的 ...
- MySQL5.7 主主复制配置
MySQL 5.7 主主复制配置 一.简介: MySQL主主复制其实就是两个MySQL主从复制组合到一起,接着我的上一篇博客<centos 7 配置 mysql 5.7 主从复制>配置即可 ...
- .NET Core集成CorrelationId实现全链路日志输出
.NET Core集成CorrelationId实现全链路日志输出 一,链路追踪 随着微服务架构的流行,一次请求会涉及多个服务的调用,并且服务本身也可能会依赖其他服务,整个请求路径会构成一个调用链,当 ...
- 多任务-python实现-gevent(2.1.15)
@ 目录 1.说明 2.代码 关于作者 1.说明 上个博文携程实现的多任务 依然是一个进程,一个线程,只不过执行了不同的代码部分 这里使用gevent,或者greenlet 当gevent执行的时候遇 ...
- 浅析JavaWeb开发模式:Model1和Model2
一.前言 在学习JavaWeb的过程中,大家都会接触到Model1和Model2,历史的发展过程是Model1 → Model2.那么它们之间有何相同之处和不同之处呢? 二.Model1 Model1 ...
- Redis 6.0 多线程性能测试结果及分析
单线程的Redis一向以简洁高效著称,但也有其阿喀琉斯之踵:阻塞!单个线程在最容易产生瓶颈的网络读写(Redis大key)请求完成之前,其他所有请求都将会被阻塞,严重影响其效率,因此Redis的多 ...