hibernate中提供了两级缓存,一级缓存是Session级别的缓存,它属于事务范围的缓存,该级缓存由hibernate管理,应用程序无需干预;二级缓存是SessionFactory级别的缓存,该级缓存可以进行配置和更改,并且可以动态加载和卸载,hibernate还为查询结果提供了一个查询缓存,它依赖于二级缓存;

一、什么是缓存

  缓存是位于应用程序和永久性数据存储源之间用于临时存放复制数据的内存区域,缓存可以降低应用程序之间读写永久性数据存储源的次数,从而提高应用程序的运行性能;

  hibernate在查询数据时,首先会到缓存中查找,如果找到就直接使用,找不到时才从永久性数据存储源中检索,因此,把频繁使用的数据加载到缓存中,可以减少应用程序对永久性数据存储源的访问,使应用程序的运行性能得以提升。

  换言之,就是用空间换时间

二、缓存优劣势

  优势:提升性能,节约时间。
  劣势:占内存。不及时性。

三、缓存何时使用

  1.内存小

  2.更新快

  3.访问频率低

  4.缓存版本多

四、缓存分类

  一级缓存 - 默认带的。Session内的缓存。Session 提交之前。访问可以自动读缓存。

@Testpublic void testfirstleve1(){Session session = null;try{session = HibernateUtil.getSession();Info data1 = session.get(Info.class, "p003");HibernateUtil.closeSession();session = HibernateUtil.getSession();//删除这一行以及上面一行时,返回的结果为trueInfo data2 = session.get(Info.class, "p003");System.out.println(data1==data2);}catch(Exception e){e.printStackTrace();}finally{HibernateUtil.closeSession();}}

  使用 load和get加载对象的时候,会自动加载到缓存,读取的也会读缓存。
  使用hql查询多条数据库,如果使用getResultList()默认是无法放到缓存中的。使用iterator()可以用在缓存中。

@Testpublic void testfirstleve2(){Session session = null;try{session = HibernateUtil.getSession();
//
//            Iterator<Info> iter= session.createQuery("from Info").iterate();
//            while(iter.hasNext()){
//                System.out.println(iter.next().getName());
//            }
//            Iterator<Info> iter1= session.createQuery("from Info").iterate();
//            while(iter1.hasNext()){
//                System.out.println(iter1.next().getName());
//            }
            List<Info> list1 = session.createQuery("from Info").getResultList();List<Info> list2 = session.createQuery("from Info").getResultList();System.out.println(list1==list2);}catch(Exception e){e.printStackTrace();}finally{HibernateUtil.closeSession();}}

输出如下:

Hibernate: select info0_.Code as Code1_1_, info0_.Nation as Nation2_1_, info0_.Name as Name3_1_, info0_.Sex as Sex4_1_, info0_.Birthday as Birthday5_1_ from mydb.info info0_
Hibernate: select info0_.Code as Code1_1_, info0_.Nation as Nation2_1_, info0_.Name as Name3_1_, info0_.Sex as Sex4_1_, info0_.Birthday as Birthday5_1_ from mydb.info info0_
false

若是把上面注释的解开:

Hibernate: select info0_.Code as col_0_0_ from mydb.info info0_
Hibernate: select info0_.Code as Code1_1_0_, info0_.Nation as Nation2_1_0_, info0_.Name as Name3_1_0_, info0_.Sex as Sex4_1_0_, info0_.Birthday as Birthday5_1_0_ from mydb.info info0_ where info0_.Code=?
周丹
Hibernate: select info0_.Code as Code1_1_0_, info0_.Nation as Nation2_1_0_, info0_.Name as Name3_1_0_, info0_.Sex as Sex4_1_0_, info0_.Birthday as Birthday5_1_0_ from mydb.info info0_ where info0_.Code=?
唐墨
Hibernate: select info0_.Code as Code1_1_0_, info0_.Nation as Nation2_1_0_, info0_.Name as Name3_1_0_, info0_.Sex as Sex4_1_0_, info0_.Birthday as Birthday5_1_0_ from mydb.info info0_ where info0_.Code=?
胡
Hibernate: select info0_.Code as Code1_1_0_, info0_.Nation as Nation2_1_0_, info0_.Name as Name3_1_0_, info0_.Sex as Sex4_1_0_, info0_.Birthday as Birthday5_1_0_ from mydb.info info0_ where info0_.Code=?
吴倩
Hibernate: select info0_.Code as col_0_0_ from mydb.info info0_
周丹
唐墨
胡
吴倩

可以看到用iterator()的时候,第一遍是查询语句,第二遍是读取的缓存。

  二级缓存 - 需要扩展外部插件。SessionFactory内的缓存。Session关了后,只要SessionFactory没有close,还可以使用缓存。

配置EhCache二级缓存:

1.复制三个包到lib文件夹下;

2.在hibernate.cfg.xml中配置,启动二级缓存

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>

3.把ehcache配置文件复制过来

<!--~ Hibernate, Relational Persistence for Idiomatic Java~~ License: GNU Lesser General Public License (LGPL), version 2.1 or later.~ See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.-->
<ehcache><!-- Sets the path to the directory where cache .data files are created.If the path is a Java System Property it is replaced byits value in the running VM.The following properties are translated:user.home - User's home directoryuser.dir - User's current working directoryjava.io.tmpdir - Default temp file path --><diskStore path="java.io.tmpdir"/><!--Default Cache configuration. These will applied to caches programmatically created throughthe CacheManager.The following attributes are required for defaultCache:maxInMemory       - Sets the maximum number of objects that will be created in memoryeternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the elementis never expired.timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only usedif the element is not eternal. Idle time is now - last accessed timetimeToLiveSeconds - Sets the time to live for an element before it expires. Is only usedif the element is not eternal. TTL is now - creation timeoverflowToDisk    - Sets whether elements can overflow to disk when the in-memory cachehas reached the maxInMemory limit.--><defaultCachemaxElementsInMemory="10000"eternal="false"timeToIdleSeconds="120"timeToLiveSeconds="120"overflowToDisk="true"/><!--Predefined caches.  Add your cache configuration settings here.If you do not have a configuration for your cache a WARNING will be issued when theCacheManager startsThe following attributes are required for defaultCache:name              - Sets the name of the cache. This is used to identify the cache. It must be unique.maxInMemory       - Sets the maximum number of objects that will be created in memoryeternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the elementis never expired.timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only usedif the element is not eternal. Idle time is now - last accessed timetimeToLiveSeconds - Sets the time to live for an element before it expires. Is only usedif the element is not eternal. TTL is now - creation timeoverflowToDisk    - Sets whether elements can overflow to disk when the in-memory cachehas reached the maxInMemory limit.--><!-- Sample cache named sampleCache1This cache contains a maximum in memory of 10000 elements, and will expirean element if it is idle for more than 5 minutes and lives for more than10 minutes.If there are more than 10000 elements it will overflow to thedisk cache, which in this configuration will go to wherever java.io.tmp isdefined on your system. On a standard Linux system this will be /tmp"
        --><cache name="sampleCache1"maxElementsInMemory="10000"eternal="false"timeToIdleSeconds="300"timeToLiveSeconds="600"overflowToDisk="true"/><!-- Sample cache named sampleCache2This cache contains 1000 elements. Elements will always be held in memory.They are not expired. --><cache name="sampleCache2"maxElementsInMemory="1000"eternal="true"timeToIdleSeconds="0"timeToLiveSeconds="0"overflowToDisk="false"/> --><!-- Place configuration for your caches following --></ehcache>

4.在实体对象的映射文件中的<class>下配置缓存。
<cache usage="read-write"/>这句话放在<class>下的第一句

5.如果使用load或get的时候,不需要其它操作,直接使用的二缓存,中间session关闭也没关系

查询缓存--根据HQL不同,缓存不同的结果
在二级缓存的基础上。加两块:
1.hibernate.cfg.xml中加上
<property name="hibernate.cache.use_query_cache">true</property> <!-- 缓存查询语句,相同的查询语句就不再去查第二遍,但对象没有缓存 -->
2.在HQL的createQuery()后加上setCacheable(true)。

@Testpublic void testsecondleve(){Session session = null;try{session = HibernateUtil.getSession();List<Info> list1 = session.createQuery("from Info").setCacheable(true).getResultList();List<Info> list2 = session.createQuery("from Info").setCacheable(true).getResultList();System.out.println(list1==list2);}catch(Exception e){e.printStackTrace();}finally{HibernateUtil.closeSession();}}

Hibernate: select info0_.Code as Code1_1_, info0_.Nation as Nation2_1_, info0_.Name as Name3_1_, info0_.Sex as Sex4_1_, info0_.Birthday as Birthday5_1_ from mydb.info info0_
false

这里的list1与list2都是查找同样的from info的hql语句,如果1与2的语句稍有不同,那么返回的查询语句就是两条,不是一条了。

对于返回List<T>对象,使用查询缓存。一级,二级缓存是不会缓存集合对象。

转载于:https://www.cnblogs.com/claricre/p/6534730.html

hibernate缓存详解相关推荐

  1. 【大话Hibernate】hibernate缓存详解

    为什么要用hibernate缓存? hibernate是一个持久层框架,经常访问物理数据库.为了降低应用程序对物理数据源访问的次数,从而提高应用程序的运行性能,我们想到使用hibernate缓存机制. ...

  2. Hibernate二级缓存详解(转)

    Hibernate二级缓存详解(转) 本文转载 http://www.blogjava.net/supercrsky/articles/238580.html 与Session相对的是,Session ...

  3. MyBatis 一级缓存二级缓存详解

    相关内容: 架构师系列内容:架构师学习笔记(持续更新) MyBatis 缓存详解 cache 缓存 缓存是一般的ORM 框架都会提供的功能,目的就是提升查询的效率和减少数据库的压力.跟Hibernat ...

  4. Hibernate配置详解

     一.简单介绍   Hibernate是一种对JDBC做了轻量级封装的对象---关系映射工具,所谓轻量级封装,是指Hibernate并没有完全封装JDBC,Java应用即可以通过Hibernate ...

  5. [面试专题]Web缓存详解

    Web缓存详解 标签(空格分隔): 缓存 缓存之于性能优化 请求更快:通过将内容缓存在本地浏览器或距离最近的缓存服务器(如CDN),在不影响网站交互的前提下可以大大加快网站加载速度. 降低服务器压力: ...

  6. vue里页面的缓存详解

    关于vue里页面的缓存详解 实用的例子ABC 往下查看 keep-alive是vue内置的一个组件,可以使被它包含的组件处于保留状态,或避免被重新渲染. 用法: 在keep-alive标签内部添加 i ...

  7. Spring循环依赖和三级缓存详解

    Spring循环依赖和三级缓存详解 Spring在启动过程中,使用到了三个map,称为三级缓存 我们可以这样理解,假设,我们只有一个缓存容器,并且缓存是直接开放给用户可以调用的,如果将未完成赋值的Be ...

  8. cpu二级缓存和一级缓存详解及区别(图解)

    cpu二级缓存和一级缓存详解及区别(图解) 2012-09-02 12:27:55|  分类: 硬件技术 |字号 订阅 处理器缓存的传输速率确实很高,然而还不足以取代内存的地位,这主要是由于缓存只是内 ...

  9. Mybatis二级缓存详解

    Mybatis二级缓存 Mybatis相关全览 一.简介 二.一级缓存 1.入口 2.演示 案例一: 案例二: 3.总结 三.二级缓存 1.入口 2.如何开启二级缓存 cache-ref配置 cach ...

最新文章

  1. 如何为网站设置站点图标
  2. golang(5):编写WebSocket服务,client和html5调用
  3. Redis 命令--Redis列表(List))
  4. 错误1083:配置成在该可执行程序中运行的这个服务不能执行该服务 【解决办法】...
  5. LightGCN:用于推荐任务的简化并增强的图卷积网络 SIGIR 2020
  6. 【数据结构----笔记4】插入排序算法之【折半插入排序算法】
  7. PaddleOCR文字识别使用
  8. python用什么编译器-Python必学之编译器用哪个好?你用错了吧!
  9. Linux关机重启指令
  10. POST 方式上传图片
  11. 牛津3000释义词典_常见英语词典集锦
  12. JNPF开发平台3.3企业版框架 力软敏捷开发框架源码7.0.6旗舰版
  13. deepin linux查看ip,deepin使用iproute配置网络命令
  14. Nacos——Distro一致性协议(架构篇)
  15. 【Halcon轮廓提取】
  16. Tkinter GUI设计中文文档
  17. 用户需求调研—快速上手篇
  18. 字符类型与Unicode 编码
  19. 收购快钱做线下支付,京东数科与蚂蚁终有一战?
  20. 论文中文翻译——Automated Vulnerability Detection in Source Code Using Deep Representation Learning

热门文章

  1. matlab 程序 收缩,基于MATLAB的小波收缩去噪方法研究(程序)
  2. go 协程和协程通信
  3. 传感器为什么在低量程偏差大_传感器作业
  4. Golang实践录:静态资源文件整合:web服务
  5. 嵌入式Linux入门8:rootfs移植
  6. java中redis存储map集合_使用RedisTemplate存储Map集合的一点注意
  7. docker -v 挂载文件_浅谈关于docker中数据卷的操作,附带案例
  8. 【java】java 线程状态之 TIMED_WAITING
  9. 95-10-120-启动-GroupCoordinator
  10. 【Java】java YYYY-MM-DD与 yyyy的区别,有重大bug