ThreadLocal与缓存

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接: https://blog.csdn.net/qq_42681787/article/details/102136888

1.ThreadLocal:线程容器,给线程绑定一个 Object 内容,后只要线程不变,可以随时取出.如果改变线程,无法取出内容

应用:

借助于线程绑定编写mybatis工具类

import java.io.IOException;
import java.io.InputStream;

import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;

public class MybatisUtils {
	private static SqlSessionFactory factory;
	private static ThreadLocal<SqlSession>tl=new ThreadLocal<SqlSession>();
	static {
		try {
			InputStream in=Resources.getResourceAsStream("mybatis.xml");
//读取全局配置文件
			factory= new SqlSessionFactoryBuilder().build(in);
			
		} catch (IOException e) {
			
			e.printStackTrace();
		}
		
	}
//调用getSession方法,从线程容器中取出SqlSession对象
	public static SqlSession getSession(){
		SqlSession session = tl.get();
		if(session==null){
			tl.set(factory.openSession());
		}
		return tl.get();
	}
	
	public static void closeSession(){
		SqlSession session = tl.get();
		if(session!=null){
			session.close();
		}
		tl.set(null);
	}

}

2.开启mybatis中的缓存 

1. 应用程序和数据库交互的过程是一个相对比较耗时的过
2. 缓存存在的意义:让应用程序减少对数据库的访问,提升程序运行 效率

3. MyBatis 中默认 SqlSession 缓存开启

在Mapper.xml中添加

<cache readOnly="true"/>

3.1 同一个 SqlSession 对象调用同一个时,只有第一次访问 数据库,第一次之后把查询结果缓存到 SqlSession 缓存区(内存)中

3.2 缓存的是 statement 对象.(简单记忆必须是用一个)

3.2.1 在 myabtis 时一个对应一个 statement 对象

3.3 有效范围必须是同一个 SqlSession 对象

4. 缓存流程

4.1 步骤一: 先去缓存区中找是否存在 statement

4.2 步骤二:返回结果

4.3 步骤三:如果没有缓存 statement 对象,去数据库获取数据

4.4 步骤四:数据库返回查询结果

4.5 步骤五:把查询结果放到对应的缓存区中  

5. SqlSessionFactory 缓存

5.1 又叫:二级缓存

5.2 有效范围:同一个 factory 内哪个 SqlSession 都可以获取

5.3 什么时候使用二级缓存:

5.3.1 当数据频繁被使用,很少被修改

5.4 使用二级缓存步骤

5.4.1 在 mapper.xml 中添加

5.4.2 如果不写 readOnly=”true”需要把实体类序列化

5.5 当 SqlSession 对象 close()时或 commit()时会把 SqlSession 缓存 的数据刷(flush)到 SqlSessionFactory 缓存区中 

猜你喜欢

转载自blog.csdn.net/qq_42681787/article/details/102136888
今日推荐