草庐IT

Mybatis缓存机制

菜鸡前来 2023-03-28 原文

1、什么是缓存(Cache)?

  • 存在内存中的临时数据

  • 将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用从磁盘上(关系型数据库数据文件)查询,从缓存中查询,从而提高查询效率,解决了高并发系统的性能问题。

2、为什么使用缓存 ?

  • 减少和数据库交互的次数,减少系统开销,提高系统效率

3、什么样的数据能使用缓存?

  • 经常查询并且不经常改变的数据

Mybatis缓存

  • Mybatis包括一个非常强大的查询缓存特性,她可以非常方便的定制和配置缓存。缓存可以极大的提高查询的效率

  • Mybatis系统中默认定义了两个缓存:一级缓存和二级缓存

    1. 默认情况下,只有一句缓存开启。(SqlSession级别的缓存,也称为本地缓存)

    2. 二级缓存需要手动开启和配置,他是基于namespace级别的缓存。

    3. 为了提高扩展性,Mybatis定义了缓存接口Cache。我们可以通过实现Cache接口来定义二级缓存

1、一级缓存

  • 一级缓存也叫本地缓存:

    1. 与数据库同一次会话期间查询到的数据会放在本地缓存中。

    2. 以后如果需要获取相同的数据,总结从缓存中拿,没必要再去查询数据库;

小结:一级缓存默认是开启的,只在一次SqlSession中有效,也就是说拿到链接到关闭连接的那个区间段、

2、二级缓存

  • 二级缓存也叫全局缓存,一级缓存作用域太低了,所以诞生了二级缓存

  • 基于namespace级别的缓存,一个名称空间,对应一个二级缓存

  • 工作机制:

    1. 一个会话查询一条数据,这个数据就会被放在当前的会话的一级缓存中;

    2. 如果当前会话关闭了,这个会话对应的一级缓存就没有了,诞生我们想要的是,会话关闭了,一级缓存中的数据被保存到二级缓存中;

    3. 新的会话查询信息,就可以从二级缓存中获取内容;

    4. 不同的mapper查出来的数据会放在自己对应的缓存(map)中;

开启二级缓存步骤:

  1. 开启全局缓存

    <!--        显示的开启全局缓存-->
            <setting name="cacheEnabled" value="true"/>
  2. 在要使用二级缓存的Mapper.xml中开启

    <!--    在当前Mapper.xml中使用二级缓存-->
        <cache></cache>

    也可以自定义参数

    <!--    在当前Mapper.xml中使用二级缓存-->
        <cache eviction="FIFO" flushInterval="60000" size="512" readOnly="true"></cache>
  3. 测试

    • 会遇到问题:我们需要将实体类序列化,否则就会报错

      Error serializing object.  Cause: java.io.NotSerializableException: com.lyh.pojo.User
    • 解决办法:

      @Data
      @AllArgsConstructor
      @NoArgsConstructor
      public class User implements Serializable {
          private int id;
          private String name;
          private String pwd;
      ​
      ​
      }
    @Test
    public void UserById(){
        SqlSession sqlSession = Mybatisutils.getSqlSession();
        UserMapper mapper = sqlSession.getMapper(UserMapper.class);
        User user = mapper.userById(1);
        System.out.println(user);
        System.out.println("--------------------");
        System.out.println("全局缓存,二级缓存,会在内存中存储方便查询,提高效率");
        UserMapper mapper2 = sqlSession.getMapper(UserMapper.class);
        User user2 = mapper2.userById(1);
        System.out.println(user2);
        sqlSession.close();
    }
  4. 小结:

    • 只要开启了二级缓存,在同一个Mapper下就有效

    • 所有的数据都会放在一级缓存中;

    • 之哟啊会话提交,或者关闭的时候,才会提交到二级缓存中

3、自定义缓存-ehcache(了解即可)

Ehcache是一种广泛使用的开源Java分布缓存,主要面向通用缓存

有关Mybatis缓存机制的更多相关文章

  1. ruby - 如何在 Ubuntu 中清除 Ruby Phusion Passenger 的缓存? - 2

    我试过重新启动apache,缓存的页面仍然出现,所以一定有一个文件夹在某个地方。我没有“公共(public)/缓存”,那么我还应该查看哪些其他地方?是否有一个URL标志也可以触发此效果? 最佳答案 您需要触摸一个文件才能清除phusion,例如:touch/webapps/mycook/tmp/restart.txt参见docs 关于ruby-如何在Ubuntu中清除RubyPhusionPassenger的缓存?,我们在StackOverflow上找到一个类似的问题:

  2. ruby-on-rails - Ruby on Rails 计数器缓存错误 - 2

    尝试在我的RoR应用程序中实现计数器缓存列时出现错误Unknownkey(s):counter_cache。我在这个问题中实现了模型关联:Modelassociationquestion这是我的迁移:classAddVideoVotesCountToVideos0Video.reset_column_informationVideo.find(:all).eachdo|p|p.update_attributes:videos_votes_count,p.video_votes.lengthendenddefself.downremove_column:videos,:video_vot

  3. ruby-on-rails - bundle 安装尝试使用缓存文件 - 2

    当我尝试进行bundle安装时,我的gem_path和gem_home指向/usr/local/rvm/gems/我没有写入权限,并且由于权限无效而失败。因此,我已将两个路径都更改为我具有写入权限的本地目录。这样做时,我进行了bundle安装,我得到:bruno@test6:~$bundleinstallFetchinggemmetadatafromhttps://rubygems.org/.........Fetchinggemmetadatafromhttps://rubygems.org/..Bundler::GemspecError:Couldnotreadgemat/afs/

  4. ruby-on-rails - Heroku Action 缓存似乎不起作用 - 2

    我一直在Heroku上尝试不同的缓存策略,并添加了他们的memcached附加组件,目的是为我的应用程序添加Action缓存。但是,当我在我当前的应用程序上查看Rails.cache.stats时(安装了memcached并使用dalligem),在执行应该缓存的操作后,我得到current和total_items为0。在Controller的顶部,我想缓存我有的Action:caches_action:show此外,我修改了我的环境配置(对于在Heroku上运行的配置)config.cache_store=:dalli_store我是否可以查看其他一些统计数据,看看它是否有效或我做错

  5. ruby-on-rails - rails expire_page 没有删除缓存的文件 - 2

    我有一个具有页面缓存的ControllerAction,我制作了一个清扫程序,它使用Controller和指定的Action调用expire_page...Controller操作呈现一个js.erb模板,所以我试图确保expire_page删除public/javascripts中的.js文件,但它没有这样做。classJavascriptsController"javascripts",:action=>"lol",:format=>'js')endend...所以,我访问javascripts/lol.js并呈现我的模板。我验证了public/javascripts/lol.js

  6. ruby-on-rails - rails 3 缓存 : expire action for named route - 2

    我的Controller有这个:caches_action:render_ticker_for_channel,:expires_in=>30.seconds在我的路由文件中我有这个:match'/render_c_t/:channel_id'=>'render#render_ticker_for_channel',:as=>:render_channel_ticker在日志文件中我看到了这个:Writefragmentviews/mcr3.dev/render_c_t/63(11.6ms)我如何手动使它过期?我需要从与渲染Controller不同的Controller使它过期,但即使

  7. ruby - 更新 gem 时 Docker 包安装缓存问题 - 2

    我在开发和生产中都使用docker,真正困扰我的一件事是docker缓存的简单性。我的ruby​​应用程序需要bundleinstall来安装依赖项,因此我从以下Dockerfile开始:添加GemfileGemfile添加Gemfile.lockGemfile.lock运行bundleinstall--path/root/bundle所有依赖项都被缓存,并且在我添加新gem之前效果很好。即使我添加的gem只有0.5MB,从头开始安装所有应用程序gem仍然需要10-15分钟。由于依赖项文件夹的大小(大约300MB),然后再花10分钟来部署它。我在node_modules和npm上遇到了

  8. ruby-on-rails - 在缓存中找不到 StaleElementReference 错误元素 - 2

    我正在使用Capybara2.1和Ruby1.9.3,使用selenium驱动程序(带有Minitest和测试单元)来测试网络应用程序。我正在努力解决StaleElementReferenceException问题。我已经看到很多关于该主题的讨论,但我无法找到解决我所面临问题的方法。所以基本上,我试图使用以下代码在我的页面上找到所有分页元素:pagination_elements=page.all('.paginationa')然后我对这些元素做一些断言,例如:pagination_elements.first.must_have_content('1')在这些断言之后,我通过单击下一

  9. 最强Http缓存策略之强缓存和协商缓存的详解与应用实例 - 2

    HTTP缓存是指浏览器或者代理服务器将已经请求过的资源保存到本地,以便下次请求时能够直接从缓存中获取资源,从而减少网络请求次数,提高网页的加载速度和用户体验。缓存分为强缓存和协商缓存两种模式。一.强缓存强缓存是指浏览器直接从本地缓存中获取资源,而不需要向web服务器发出网络请求。这是因为浏览器在第一次请求资源时,服务器会在响应头中添加相关缓存的响应头,以表明该资源的缓存策略。常见的强缓存响应头如下所述:Cache-ControlCache-Control响应头是用于控制强制缓存和协商缓存的缓存策略。该响应头中的指令如下:max-age:指定该资源在本地缓存的最长有效时间,以秒为单位。例如:Ca

  10. ruby-on-rails - 缓存 WSDL 文件而不是在每个 SOAP 请求时获取它 - 2

    我正在构建一个Rails应用程序,该应用程序将基本上包含一组SOAP命令。我不想每次都获取WSDL来实现某种缓存方法,尽管我不太确定从哪里开始执行此操作。是否有特定于Rails的东西可以帮助我,或者我应该通过Ruby下载文件并加载它?只是在寻找某种总体方向...... 最佳答案 如果您使用savon然后是remoteWSDLwillbedownloadedonceperclientinstance:the(remote)WSDLhastobedownloadedandparsedonceforeveryclientandsocome

随机推荐