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 连接池和事务控制的更多相关文章

  1. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_6 mybatis中的事务原理和自动提交设置

    在实际的开发中,建议使用连接池的形式. JNDI的资料 H:\BaiDu\黑马传智JavaEE57期 2019最新基础+就业+在职加薪\讲义+笔记+资料\主流框架\31.会员版(2.0)-就业课(2. ...

  2. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_3 mybatis连接池的分类

    2.mybatis中的连接池     mybatis连接池提供了3种方式的配置:         配置的位置:             主配置文件SqlMapConfig.xml中的dataSourc ...

  3. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_5 mybatis中使用poolead配置连接的原理分析

    idelConnection是空闲的链接 idelConnection就是ArrayList的数组 如果没有空闲的就new一个 新的connection 一个空闲池,一个活动的池,一个链接过来.空闲池 ...

  4. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_4 mybatis中使用unpooled配置连接池的原理分析

    把之前的CRUD的代码src下的代码都复制过来 依赖项也都复制过来, 配置文件 整理一番 执行findAll方法的测试 查看日志的输出部分 修改程序池 再来执行findAll方法 Plooled从连接 ...

  5. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_2 连接池介绍

  6. 阶段3 1.Mybatis_07.Mybatis的连接池及事务_1 今日课程内容介绍

  7. MyBatis基础_连接池与事务、动态SQL、注解开发

    一.MyBatis连接池及事务控制 1.连接池 在实际开发中,都会使用连接池,因为它可以减少获取连接缩消耗的时间.所谓连接池,就是存储数据库连接的容器.连接池中存储一定数量的数据库连接,当线程需要使用 ...

  8. Mybatis 的连接池技术

    我们在前面的 WEB 课程中也学习过类似的连接池技术,而在 Mybatis 中也有连接池技术,但是它采用的是自 己的连接池技术.在 Mybatis 的 SqlMapConfig.xml 配置文件中,通 ...

  9. Spring Boot1.5.4 连接池 和 事务

    原文:https://github.com/x113773/testall/issues/10 默认连接池---spring Boot中默认支持的连接池有Tomcat.HikariCP .DBCP . ...

随机推荐

  1. 九、git学习之——git基本命令全总结

    初始化一个Git仓库,使用git init命令. 添加文件到Git仓库,分两步: git add <file>,注意,可反复多次使用,添加多个文件: 使用命令git commit,完成. ...

  2. 手机版LED弹幕显示屏

    这是一款可以自制超大滚动字幕的LED显示屏APP.可以随你喜欢, 演唱会,电竞比赛,晚会,接机,寻人! 随时随地输入文字, 传达讯息,酒吧夜店疯狂打Call工具!蹦迪必备!超帅!下载地址:https: ...

  3. 【Django】django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required;

    报错信息 django.core.exceptions.ImproperlyConfigured: mysqlclient 1.4.0 or newer is required; you have 0 ...

  4. pytorch和tensorflow的爱恨情仇之一元线性回归例子(keras插足啦)

    直接看代码: 一.tensorflow #tensorflow import tensorflow as tf import random import numpy as np x_data = np ...

  5. 【原创】Linux PCI驱动框架分析(一)

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  6. Gradle AndroidStudio内网离线构建配置踩坑记录

    最近一家新公司,由于办公环境都是在内网机上,导致在Unity导出android工程后,gradle离线构建也是第一次搞,花了一天时间也踩了一些坑,最后也终于构建成功了,这里记录下,方便大家少走些弯路. ...

  7. 用Python批量爬取优质ip代理

    前言 有时候爬的次数太多时ip容易被禁,所以需要ip代理的帮助.今天爬的思路是:到云代理获取大量ip代理,逐个检测,将超时不可用的代理排除,留下优质的ip代理. 一.爬虫分析 首先看看今天要爬取的网址 ...

  8. 【python爬虫】一个简单的爬取百家号文章的小爬虫

    需求 用"老龄智能"在百度百家号中搜索文章,爬取文章内容和相关信息. 观察网页 红色框框的地方可以选择资讯来源,我这里选择的是百家号,因为百家号聚合了来自多个平台的新闻报道.首先看 ...

  9. Autofac官方文档翻译--二、解析服务--1解析参数传递

    Autofac 传递解析参数 注册组件公开相应的服务之后,你可以从container构造器和子lifetime scopes 中解析服务.使用Resolve()方法来实现: var builder = ...

  10. Python--批量修改文件名称

    Dr. he 最近忙着毕业论文的事情,需要将一千多张超声切面图的文件名后缀名去掉,例如:剔除文件名"1802014223FAMFIBAI.jpg"的第11个字符至第18个字符&qu ...