Java第三十七天,Mybatis框架系列,Mybatis 的连接池以及事务控制
一、连接池
1.如何配置
Mybatis连接池技术是采用自己的连接池技术。在 Mybatis 的 SqlMapConfig.xml 配置文件中, 通过
<dataSource type=”pooled”>
来实现 Mybatis 中连接池的配置
2.Mybatis 将自己的数据源分为三类:
UNPOOLED | 不使用连接池的数据源 |
POOLED | 使用连接池的数据源 |
JNDI | 使用 JNDI 实现的数据源 |
MyBatis 内部分别定义了实现了 java.sql.DataSource 接口的 UnpooledDataSourcePooledDataSource 类来表示 UNPOOLED、 POOLED 类型的数据源
- POOLED ===> 采用传统的 java.sql.DataSource 规范中的连接池;它必须是线程安全的,即不同线程拿不同的连接;内部实现中有两个池子——空闲池和连接池;每次发情申请的时候都是先到空闲池中看看是否还有连接可用,如果是则直接连接,如果没有则到活动池寻找;如果活动池是否已经到了最大连接数量,则寻找最早的连接并返回
- UNPOOLED ===> 采用传统的获取连接的方式;虽然实现了 java.sql.DataSource 接口,但是并没有采用连接池;每次使用都是根据规范,依次注册驱动,获取连接等一些列操作
- JNDI ===> 采用服务器提供的JNDI技术实现来获取 DataSource 对象;不同的服务器拿到的 DataSource 是不一样的;如果不是 Web 或者 Maven 的大工程,是不能使用的;Tomcat 服务器采用的连接池是 dbcp 连接池
二、事务处理
1.jdbc中的事务处理
在 JDBC 中我们可以通过手动方式将事务的提交改为手动方式,通过 setAutoCommit()方法即可
setAutoCommit(bool autoCommit)
1.1函数功能
设置当前连接是否为自动提交模式。如果连接处于自动提交模式下,则它的所有SQL 语句将被执行并作为单个事务提交。否则,它的SQL语句将集到事务中,直到调用commit方法或rollback方法为止。默认情况下,新连接处于自动提交模式
1.2注意事项
(1)如果在事务和自动提交模式更改期间调用此方法,则提交该事务。如果调用setAutoCommit而自动提交模式未更改,则该调用无操作
(2)提交发生在语句完成时。语句完成的时间取决于SQL语句的类型
- 对于DML 语句(比如 Inset、Update或Delete)和DDL语句,语句在执行完毕时完成
- 对于Select 语句,语句在关联结果集关闭时完成
- 对于CallableStatement对象或者返回多个结果的语句,语句在所有关联结果集关闭并且已获得所有更新计数和输出参数时完成
2.mybatis中的事务处理
Mybatis 中事务的提交方式,本质上就是调用 JDBC 的 setAutoCommit()来实现事务控制
1.为什么 CUD 过程中必须使用 sqlSession.commit()提交事务?
(1)CUD 操作过程中,我们都要手动进行事务的提交,原因是 setAutoCommit()方法,在执行时它的值被设置为 false 了,所以我们在 CUD 操作中,必须通过 sqlSession.commit()方法来执行提交操作
(2)在连接池中取出的连接,都connection.setAutoCommit(false)方法,这样我们就必须使用 sqlSession.commit()方法,相当于使用了 JDBC 中的 connection.commit()方法实现事务提交
2.解决办法
(1)解读源码
(2)通过源码分析,我们发现了只需要在创建 sqlSession 对象的同时,传入控制是否自动提交的参数即可
// 1.读取配置文件
in = Resources.getResourceAsStream("SqlMapConfig.xml");
// 2.创建构建者对象
SqlSessionFactoryBuilder builder = new SqlSessionFactoryBuilder();
// 3.创建 SqlSession 工厂对象
fa ctory = builder.build(in);
//4.创建 SqlSession 对象
// 这里控制是否自动提交事务
session = factory.openSession(true);
// 5.创建 Dao 的代理对象
userDao = session.getMapper(xxx.class);