0
点赞
收藏
分享

微信扫一扫

FPGA高端项目:UltraScale GTH + SDI 视频解码,SDI转DP输出,提供2套工程源码和技术支持

毅会 2023-12-15 阅读 44

mybaits提供一级缓存,和二级缓存


一级缓存(默认开启)

 

 

 
@Test
 
   public void testCache1() throws Exception{
 
      SqlSessionsqlSession = sqlSessionFactory.openSession();//创建代理对象
 
      UserMapperuserMapper = sqlSession.getMapper(UserMapper.class);
 
     
 
      //下边查询使用一个SqlSession
 
      //第一次发起请求,查询id为1的用户
 
      Useruser1 = userMapper.findUserById(1);
 
      System.out.println(user1);
 
     
 
//    如果sqlSession去执行commit操作(执行插入、更新、删除),清空SqlSession中的一级缓存,这样做的目的为了让缓存中存储的是最新的信息,避免脏读。
 
     
 
      //更新user1的信息
 
      user1.setUsername("测试用户22");
 
      userMapper.updateUser(user1);
 
      //执行commit操作去清空缓存
 
      sqlSession.commit();
 
     
 
      //第二次发起请求,查询id为1的用户
 
      Useruser2 = userMapper.findUserById(1);
 
      System.out.println(user2);
 
     
 
      sqlSession.close();
 
     
 
   }

service{
 
         //开始执行时,开启事务,创建SqlSession对象
 
         //第一次调用mapper的方法findUserById(1)
 
        
 
         //第二次调用mapper的方法findUserById(1),从一级缓存中取数据
 
        
 
//aop控制 只要方法结束,sqlSession关闭 sqlsession关闭后就销毁数据结构,清空缓存
 
         Service结束sqlsession关闭
 
}


二级缓存

MyBatis的二级缓存是Application级别的缓存

 


开启二级缓存

mybaits的二级缓存是mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还要在具体的mapper.xml中开启二级缓存。

在核心配置文件SqlMapConfig.xml中加入

<setting name="cacheEnabled"value="true"/>
 
<!-- 全局配置参数,需要时再设置 -->
 
    <settings>
 
       <!-- 开启二级缓存  默认值为true -->
 
    <setting name="cacheEnabled" value="true"/>
 
    </settings>
 

在UserMapper.xml中开启二缓存,UserMapper.xml下的sql执行完成会存储到它的缓存区域(HashMap)

<mapper namespace="cn.hpu.mybatis.mapper.UserMapper">
 
<!-- 开启本mapper namespace下的二级缓存 -->
 
<cache></cache>
 

调用pojo类实现序列化接口

public class Userimplements Serializable {
 
    //Serializable实现序列化,为了将来反序列化
 

二级缓存需要查询结果映射的pojo对象实现java.io.Serializable接口实现序列化和反序列化操作,注意如果存在父类、成员pojo都需要实现序列化接口。

pojo类实现序列化接口是为了将缓存数据取出执行反序列化操作,因为二级缓存数据存储介质多种多样,不一定在内存有可能是硬盘或者远程服务器。
 

// 二级缓存测试
 
   @Test
 
   public void testCache2() throws Exception {
 
      SqlSessionsqlSession1 = sqlSessionFactory.openSession();
 
      SqlSessionsqlSession2 = sqlSessionFactory.openSession();
 
      SqlSessionsqlSession3 = sqlSessionFactory.openSession();
 
      // 创建代理对象
 
      UserMapperuserMapper1 = sqlSession1.getMapper(UserMapper.class);
 
      // 第一次发起请求,查询id为1的用户
 
      Useruser1 = userMapper1.findUserById(1);
 
      System.out.println(user1);
 
     
 
      //这里执行关闭操作,将sqlsession中的数据写到二级缓存区域
 
      sqlSession1.close();
 
     
 
      //使用sqlSession3执行commit()操作
 
      UserMapperuserMapper3 = sqlSession3.getMapper(UserMapper.class);
 
      Useruser  = userMapper3.findUserById(1);
 
      user.setUsername("张明明");
 
      userMapper3.updateUser(user);
 
      //执行提交,清空UserMapper下边的二级缓存
 
      sqlSession3.commit();
 
      sqlSession3.close();
 
     
 
      UserMapperuserMapper2 = sqlSession2.getMapper(UserMapper.class);
 
      // 第二次发起请求,查询id为1的用户
 
      Useruser2 = userMapper2.findUserById(1);
 
      System.out.println(user2);
 
 
 
      sqlSession2.close();
 
   }


mybatis整合ehcache

ehcache是一个分布式缓存框架。

EhCache 是一个纯Java的进程内缓存框架,是一种广泛使用的开源Java分布式缓存,具有快速、精干等特点,是Hibernate中默认的CacheProvider。

不使用分布缓存,缓存的数据在各各服务单独存储,不方便系统开发。所以要使用分布式缓存对缓存数据进行集中管理。

mybatis无法实现分布式缓存,需要和其它分布式缓存框架进行整合。

整合方法(掌握无论整合谁,首先想到改type接口)

mybatis提供了一个cache接口,如果要实现自己的缓存逻辑,实现cache接口开发即可。

mybatis和ehcache整合,mybatis和ehcache整合包中提供了一个cache接口的实现类。

加入ehcache包

整合ehcache

配置mapper中cache中的type为ehcache对cache接口的实现类型。

<mapper namespace="cn.hpu.mybatis.mapper.UserMapper">
 
<!-- 开启本mapper namespace下的二级缓存
 
   type:指定cache接口实现类,mybatis默认使用PerpetualCache
 
   要和eache整合,需要配置type为ehcahe实现cache接口的类型
 
 -->
 
<cache type="org.mybatis.caches.ehcache.EhcacheCache">
 
</cache>

可以根据需求调整缓存参数:

<cache type="org.mybatis.caches.ehcache.EhcacheCache">
 
        <property name="timeToIdleSeconds" value="3600"/>
 
        <property name="timeToLiveSeconds" value="3600"/>
 
        <!-- 同ehcache参数maxElementsInMemory-->
 
       <property name="maxEntriesLocalHeap"value="1000"/>
 
       <!-- 同ehcache参数maxElementsOnDisk -->
 
        <property name="maxEntriesLocalDisk" value="10000000"/>
 
        <property name="memoryStoreEvictionPolicy" value="LRU"/>
 
    </cache>

加入ehcache的配置文件

在classpath下配置ehcache.xml

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 
    xsi:noNamespaceSchemaLocation="../config/ehcache.xsd">
 
    <diskStore path="F:\develop\ehcache"/>
 
    <defaultCache
 
maxElementsInMemory="1000"
 
       maxElementsOnDisk="10000000"
 
       eternal="false"
 
       overflowToDisk="false"
 
       timeToIdleSeconds="120"
 
       timeToLiveSeconds="120"
 
       diskExpiryThreadIntervalSeconds="120"
 
       memoryStoreEvictionPolicy="LRU">
 
    </defaultCache>
 
</ehcache>


集成SpringBoot缓存相关问题

MyBatis 一级缓存(MyBaits 称其为 Local Cache)无法关闭,但是有两种级别可选:

举报

相关推荐

0 条评论