MyBatis(八)Mybatis连接池与事务深入

一、Mybatis的连接池技术

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

1. Mybatis连接池的分类

<dataSource type=”pooled”>中type属性就是用来指定使用何种的连接池,它的取值有三种。

我们可以打开mybatis的包结构:
在这里插入图片描述
我们可以看到mybatis把它自己的数据源分为三类:
UNPOOLED :采用传统的获取连接的方式,虽然也实现javax.sql.DataSource接口,但是并没有使用池的思想。
POOLED :采用传统的javax.sql.DataSource规范中的连接池,mybatis中有针对规范的实现。
JNDI :采用服务器提供的JNDI技术实现,来获取DataSource对象,不同的服务器所能拿到DataSource是不一样。注意:如果不是web或者maven的war工程,是不能使用的。比如我们使用的是tomcat服务器,采用连接池就是dbcp连接池。

2. 项目准备

新建一个maven工程:
在这里插入图片描述
我们还是把前面day02_01的src文件夹全部复制过来。
在这里插入图片描述
并且导入依赖信息:
在这里插入图片描述

3. 不同取值的不同输出

我们可以使用不同的取值来实验不同的输出结果:
首先是POOLED:
在这里插入图片描述
然后是UNPOOLED的取值:
在这里插入图片描述
我们可以看到,POOLED的取值里面,多了一个create connection的操作,最后还多了一个returned connection ***** to pool的过程,也就是POOLED是每次都从连接池中获取连接使用,而UNPOOLED是每次都创建一个新的连接来使用。
在这里插入图片描述

4. 类的实现

MyBatis 内部分别定义了实现了 java.sql.DataSource 接口的 UnpooledDataSourcePooledDataSource 类来表示 UNPOOLED、POOLED 类型的数据源。
在这里插入图片描述
PooledDataSource和UnpooledDataSource都实现了java.sql.DataSource接口。
并且PooledDataSource持有一个UnpooledDataSource的引用,
当PooledDataSource需要创建java.sql.Connection实例对象时,还是通过UnpooledDataSource来创建。
PooledDataSource只是提供种缓存连接池机制。

我们一般采用的是 POOLED数据源(很多时候我们所说的数据源就是为了更好的管理数据库连接,也就是我们所说的连接池技术)。

5. UNPOOLED的执行过程

我们打开UnpooledDataSource实现类,找到getConnection方法:
在这里插入图片描述

6. POOLED的执行过程

我们打开PooledDataSource实现类,也是找到getConnection方法:
在这里插入图片描述


二、Mybatis的事务控制

1. mybatis的事务提交方式

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

我们运行之前的代码:

@Before //用于在测试方法执行之前执行
public void init() throws IOException {
    // 1. 读取配置文件,生成字节输入流
    in = Resources.getResourceAsStream("SqlMapConfig.xml");
    // 2. 获取SqlSessionFactory
    SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
    // 3. 获取SqlSession对象
    sqlSession = factory.openSession();
    // 4. 获取Dao的代理对象
    userDao = sqlSession.getMapper(IUserDao.class);
}

@After //用于在测试方法执行之后执行
public void destory() throws IOException {
    // 最后一定要提交事务,否则会回滚操作,导致保存无效
    sqlSession.commit();
    // 6. 释放资源
    sqlSession.close();
    in.close();
}

/**
 * 测试保存操作
 */
@Test
public void testSave() throws IOException {
    User user = new User();

    user.setUsername("刘伟佳");
    user.setAddress("山东省");
    user.setSex("男");
    user.setBirthday(new Date());
    
    // 执行保存方法
    userDao.saveUser(user);
}

我们观察一下在控制台的输出结果:
在这里插入图片描述
这是我们的connection的变化过程,这样我们就知道为什么在CUD操作过程中,我们都需要手动进行事务的提交,原因是setAutoCommit()方法,在执行的时它的值被设置为了false,所以我们在CUD的操作中,必须通过sqlSession.commit()方法来执行提交操作。

2. 设置自动提交

那么如何设置为自动提交呢?
我们可以在获取session对象的时候,添加参数:
在这里插入图片描述
我们打开openSession()的源码:
在这里插入图片描述
我们看到其中有一个就是布尔类型的参数,就可以设置是否自动提交。

例如:
在这里插入图片描述
我们测试一下保存操作:

/**
 * 测试保存操作
 */
@Test
public void testSave() throws IOException {
    User user = new User();
    user.setUsername("刘伟佳");
    user.setAddress("北京");
    user.setSex("男");
    user.setBirthday(new Date());
    // 执行保存方法
    userDao.saveUser(user);
}

我们可以看到日志里面就没有刚才的设置为false什么的了:
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值