mybatis-sqlSession工具类,事务处理器的实现
1.作用域(Scope)和生命周期
理解不同作用域和生命周期类别是至关重要的,因为错误的使用会导致非常严重的并发问题。
依赖注入框架可以创建线程安全的、基于事务的 SqlSession 和映射器,并将它们直接注入到你的 bean 中,因此可以直接忽略它们的生命周期。
1.1SqlSessionFactoryBuilder
这个类可以被实例化、使用和丢弃,一旦创建了sqlSessionFactory,我们就不在需要它了
1.2SqlSessionFactory
一旦被创建就应该在应用的运行期间一直存在,没有任何理由丢弃它或重新创建另一个实例,因此我们可以将它写在静态方法中,初始化实例对象,只初始化一次
1.3SqlSession
每个线程都应该有它自己的SqlSession实例。SqlSession的实例不是安全的,因此不能被共享,所以它最佳的作用域应该是一次请求或者是方法作用域
2.sqlSession工具类的实现
2.1实现思路
思路:
在类加载的时候,我们初始化sqlSessionFactory对象
获取当前线程中的sqlSession对象,当我们第一次获取时一定为空,这时我们进行为空判断,创建sqlSession对象,并绑定到当前线程中
释放资源的方法,解除sqlSession与当前线程的绑定关系
重要:tomcat自带线程池,并发量不高时,新的请求进入,会自动分配一个全新的线程。在高并发的情况下,用过的t1线程,下一个请求进入时,很有可能会使用这个线程,这时进行步骤2必然会获取到有sqlSession的线程,所以我们这里要进行解绑也就是调用remove()方法
回滚事务的方法
2.2具体实现
package com.yth.utils;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import java.io.IOException;
/**
* SqlSession工具类
* @author yth
* @date 2020/10/14 - 8:08
*/
public class SqlSessionUtils {
//工具类的构造方法都是一般都是私有化的,因为工具类的使用不需要实例化
private SqlSessionUtils(){
}
private static SqlSessionFactory sqlSessionFactory;
private static ThreadLocal<SqlSession