myBatis缓存日志 --SqlSessionTemplate 缓存使用

本文介绍了myBatis的一级缓存默认开启,同一SqlSession内的相同查询会利用缓存,不同SqlSession则需要重新查询。SqlSessionTemplate在创建时会两次连接数据库。二级缓存默认关闭,需要手动开启,配置包括全局开关、Mapper级别的缓存启用,并需要注意只读设置及序列化要求。提交后缓存才生效,遵循LRU算法并限制缓存大小。
摘要由CSDN通过智能技术生成
1. 一级缓存默认是开启的,

​ MyBatis 默认开启了一级缓存,一级缓存是在SqlSession 层面进行缓存的。即,同一个SqlSession ,多次调用同一个Mapper和同一个方法的同一个参数,只会进行一次数据库查询,然后把数据缓存到缓冲中,以后直接先从缓存中取出数据,不会直接去查数据库。

​ 但是不同的SqlSession对象,因为不用的SqlSession都是相互隔离的,所以相同的Mapper、参数和方法,他还是会再次发送到SQL到数据库去执行,返回结果。

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
  "classpath*:/spring.xml", "classpath*:/spring-servlet_.xml"})
public class test {
   
    @Resource
    SqlSessionTemplate sqlSession;

    @Resource
    SqlSessionFactoryBean factoryBean;
   @Test
    public void testWithManeulSession() throws Exception {

        //同一个ManulSession下, 会开启一级缓存,
        //此处直接使用注入的factoryBean 获取sqlsession(DefaultSqlSession) ,
        //请于SqlSessionTemplate类区分开
        SqlSessionFactory factory = factoryBean.getObject();
        SqlSession manulSqlSession = factory.openSession(true);

        UserMapper mapper = manulSqlSession.getMapper(UserMapper.class);
        User u = mapper.selectByPrimaryKey(1);
        User u_ = mapper.selectByPrimaryKey(1);


        UserMapper mapper2 = manulSqlSession.getMapper(UserMapper.class);
        User u2 = mapper2.selectByPrimaryKey(1);

        System.out.println("同一个ManulSession下, 会开启一级缓存");

        /*
        运行结果
    JDBC Connection [com.mysql.jdbc.JDBC4Connection@68577ba8] will not be managed by Spring
    ==>  Preparing: select id, name, age, sex from User where id = ? 
    ==> Parameters: 1(Integer)
    <==    Columns: id, name, age, sex
    <==        Row: 1, name1, 20, 0
    <==      Total: 1
    同一个ManulSession下, 会开启一级缓存        
        * */
    }
 }
SqlSessionTemplate 特例

注入的单例 SqlSessionTemplate 内部包含SqlSessionProxy对象, 其是对SqlSession的代理. 构造函数如下:

    public SqlSessionTemplate(SqlSessionFactory sqlSessionFactory, ExecutorType executorType, PersistenceExceptionTranslator exceptionTranslator) {
        Assert.notNull(sqlSessionFactory, "Property \'sqlSessionFactory\' is required");
        Assert.notNull(executorType, "Property \'executorType\' is required");
        this.sqlSessionFactory = sqlSessionFactory;
        this.executorType = executorType;
//此处为对sqlsession的一次代理, 代码运行中,由内部类SqlSessionInterceptor 进行拦截
        this.sqlSessionProxy = 
         new Class[]{SqlSession.class}, 
         new SqlSessionTemplate.SqlSessionInterceptor()
         );
    }

    private class SqlSessionInterceptor
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值