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 缓存区中
因篇幅问题不能全部显示,请点此查看更多更全内容