Mybatis

您所在的位置:网站首页 mybatis缓存级别 Mybatis

Mybatis

#Mybatis| 来源: 网络整理| 查看: 265

  为什么使用缓存?

         用户减轻数据压力,提供数据库性能,提供了一级缓存和二级缓存;

         一级缓存在操作数据库时需要构造SqlSession对象,在对象中有一个数据结构(HashMap)用户存储缓存数据;用户存储缓存数据,不同的SqlSession之间的缓存数据区域(HashMap)是互不影响的;

         二级缓存是Mapper级别的缓存,多个SqlSession去操作一个Mapper的Sql语句,多个SqlSession可以供用二级缓存,二级缓存时夸SqlSession的;

 

2. 一级缓存

     mybaties默认支持一级缓存,不需要再配置文件中配置;

                                          

Mybatis - 查询缓存(一级缓存,二级缓存,与ehcache整合)_mybatis

             如果sqlSession去执行了commit操作(插入,更新,删除),情况SqlSession中的以及缓存,这样做的目的是为了让缓存中存储的是最新的信息,避免脏读;

              比如:

@Test public void testfindClientByName() throws Exception { SqlSession os = sqlSessionFactory.openSession(); ClientMapper cp = os.getMapper(ClientMapper.class); List clients = cp.findClientByName("ya"); System.out.println("第一次加载:"+clients); Client c=new Client(); c.setBron_date(new Date()); c.setClient_certificate_no("客户信息"); c.setContact_mode("12121212"); c.setCreate_date(new Date()); c.setFamily_register_address("家庭住址"); c.setId(10009); c.setNow_address("目前的家庭住址"); c.setUrgency_contact_mode("我去"); c.setUsername("萨达姆"); cp.insertIntoClient(c); os.commit(); List clientss = cp.findClientByName("ya"); System.out.println("第二次加载:"+clientss); os.close(); }

应用:

                 正式开放,将Mybatis和Spring进行整合开发,事务控制在service中,一个service方法中包括了很多mapper方法的调用。

 如果执行两个service调用查询相同的用户信息,不走一级缓存,因为session方法结束后,sqlsession就关闭了,缓存就清空了;

   3. 二级缓存 (mybatis的二级缓存使用场景)

                                         

Mybatis - 查询缓存(一级缓存,二级缓存,与ehcache整合)_resultType_02

        sqlsession1去查询时会将查询到的数据存储在二级缓存中,sqlsession2去查询时会去缓存中找是否有数据,如果存在直接从缓存中取出数据;如果sqlsession3执行了commit操作,则缓存将被清空;

 

      二级缓存与一级缓存的区别是:

                        二级缓存范围更大,多个sqlsession可以共享一个mapper的缓存区域。

        二级缓存区域:  

                        按namespace分,每一个mapper有一个缓存区域,两个mapper的namespace如果相同,这两个mapper执行的sql查询到的数据存在相同得二级缓存区域中;

 

实现步骤 :

 

     (1) 开启二级缓存 : mybatis的二级缓存时mapper范围级别,除了在SqlMapConfig.xml设置二级缓存的总开关,还有在具体的mapper.xml中开启二级缓存;

SqlMapConfig.xml : Mapper.xml : 参数 :flushInterval : 刷新间隔 size :缓存的大小,默认1024 ; onlyRead :只读

  

       (2)  Pojo类实现序列化接口 :class User implements Serializable;

 

                        sqlSession.close();执行关闭操作,将sqlSession中的数据,写入缓存中;

        sqlSession.commit(); 执行提交操作,将当前mapper下的缓存清空;

 

                         在statement中 useCache="false" 禁用缓存;针对每次查询都需要最新的数据sql,要设置useCache=false;

select * from f_client where id=#{value}

                  

select * from f_client where id=#{value}

         与ehcache缓存整合 :

 ehcache是一个分布式缓存框架;为了提高系统并发,性能,一般对系统进行分布式部署;

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

              对缓存数据进行集中管理,使用分布式缓存框架,redis,memcached,ehcache;

          方法 :

        mybatis提供了一个cache接口,如果自己实现的缓存逻辑,实现Cache接口开发接口;

mybatis和ehcache进行整合,只需要实现mybatis的接口即可;

mapper.xml中 开启二级缓存需要 , type制定的cache接口的实现类型,mybatis默认使用的是PerpetualCache,

  要和ehcache整合,需要配置type为echcache实现的cache接口类型;

   加入ehcache的配置文件;

   

         应用场景:

             对访问多的查询请求且用户查询结果实时性要求不高的,此时采用mybatis二级缓存技术降低数据库访问量,提供访问速度,

   业务场景:

            耗时较高的统计分析 sql ,电话账单查询sql, 实现方法 通过设置刷新间隔时间,由mybatis每隔多长时间只需刷新缓存;

   局限行:

              二级缓存对细粒度的数据级别的缓存实现不好,比如:改商品价格,如果mapper.xml中有一个执行了commit操作,那么缓存就会被清空;



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3