一、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
接口的 UnpooledDataSource
, PooledDataSource
类来表示 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什么的了:
转载:https://blog.csdn.net/u014565127/article/details/105850756