一级缓存就是Session级别的缓存,close后就没了。

二级缓存就是SessionFactory级别的缓存,全局缓存,要配置其他插件。

 什么样的数据适合存放到第二级缓存中?

  1、很少被修改的数据

  2、不是很重要的数据,允许出现偶尔并发的数据

  3、不会被并发访问的数据

  4、参考数据

  不适合存放到第二级缓存的数据?

  1、经常被修改的数据

  2、财务数据,绝对不允许出现并发

  3、与其他应用共享的数据。

        Hibernate的二级缓存策略的一般过程如下:

  1) 条件查询的时候,总是发出一条select * from table_name where …. (选择所有字段)这样的SQL语句查询数据库,一次获得所有的数据对象。

  2) 把获得的所有数据对象根据ID放入到第二级缓存中。

  3) 当Hibernate根据ID访问数据对象的时候,首先从Session一级缓存中查;查不到,如果配置了二级缓存,那么从二级缓存中查;查不到,再查询数据库,把结果按照ID放入到缓存。

  4) 删除、更新、增加数据的时候,同时更新缓存。

      配置2级缓存

   Hibernate有很多值得学习的地方,这里我们主要介绍配置Hibernate二级缓存,包括介绍在Spring托管的Hibernate二级缓存等方面。

使用EhCache配置Hibernate二级缓存:

配置Hibernatee二级缓存准备:

1)把ehcache-1.2.3.jar加入到当前应用的classpath中。

2)在hibernate.cfg.xml文件中加入EhCache缓存插件的提供类。

  1. <property name="hibernate.cache.provider_class">
  2. org.hibernate.cache.EhCacheProvider
  3. </property>

3)挎贝ehcache.xml文件到类路径(项目工程的src目录下),这个文件在Hibernate安装目录的etc下。

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping>
  5. <class name="org.qiujy.domain.cachedemo.Category" table="categories">
  6. //配置缓存,必须紧跟在class元素后面对缓存中的Category对象采用读写型的并发访问策略
  7. <cache usage="read-write"/>
  8. <id name="id" type="java.lang.Long">
  9. <column name="id" />
  10. <generator class="native" />
  11. </id>
  12. <!-- 配置版本号,必须紧跟在id元素后面 -->
  13. <version name="version" column="version" type="java.lang.Long" />
  14. <property name="name" type="java.lang.String">
  15. <column name="name" length="32" not-null="true"/>
  16. </property>
  17. <property name="description" type="java.lang.String">
  18. <column name="description" length="255"/>
  19. </property>
  20. <set name="products" table="products" cascade="all" inverse="true">
  21. <cache usage="read-write"/>
  22. <key column="categoryId" not-null="true"/>
  23. <one-to-many class="org.qiujy.domain.cachedemo.Product"/>
  24. </set>
  25. </class>
  26. </hibernate-mapping>

Product.hbm.xml

  1. <?xml version="1.0" encoding="utf-8"?>
  2. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
  3. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
  4. <hibernate-mapping>
  5. <class name="org.qiujy.domain.cachedemo.Product" table="products">
  6. <cache usage="read-write"/>
  7. <id name="id" type="java.lang.Long">
  8. <column name="id" />
  9. <generator class="native" />
  10. </id>
  11. <!-- 配置版本号,必须紧跟在id元素后面 -->
  12. <version name="version" column="version" type="java.lang.Long" />
  13. <property name="name" type="java.lang.String">
  14. <column name="name" length="32" not-null="true"/>
  15. </property>
  16. <property name="description" type="java.lang.String">
  17. <column name="description" length="255"/>
  18. </property>
  19. <property name="unitCost" type="java.lang.Double">
  20. <column name="unitCost" />
  21. </property>
  22. <property name="pubTime" type="java.util.Date">
  23. <column name="pubTime" not-null="true" />
  24. </property>
  25. <many-to-one name="category"
  26. column="categoryId"
  27. class="org.qiujy.domain.cachedemo.Category"
  28. cascade="save-update"
  29. not-null="true">
  30. </many-to-one>
  31. </class>
  32. </hibernate-mapping>

编辑ehcache.xml文件:

  1. <ehcache>
  2. <diskStore path="c:\\ehcache\"/>
  3. <defaultCache
  4. maxElementsInMemory="10000"
  5. eternal="false"
  6. timeToIdleSeconds="120"
  7. timeToLiveSeconds="120"
  8. overflowToDisk="true"
  9. />
  10. <!-- 设置Category类的缓存的数据过期策略 -->
  11. <cache name="org.qiujy.domain.cachedemo.Category"
  12. maxElementsInMemory="100"
  13. eternal="true"
  14. timeToIdleSeconds="0"
  15. timeToLiveSeconds="0"
  16. overflowToDisk="false"
  17. />
  18. <!-- 设置Category类的products集合的缓存的数据过期策略 -->
  19. <cache name="org.qiujy.domain.cachedemo.Category.products"
  20. maxElementsInMemory="500"
  21. eternal="false"
  22. timeToIdleSeconds="300"
  23. timeToLiveSeconds="600"
  24. overflowToDisk="true"
  25. />
  26. <cache name="org.qiujy.domain.cachedemo.Product"
  27. maxElementsInMemory="500"
  28. eternal="false"
  29. timeToIdleSeconds="300"
  30. timeToLiveSeconds="600"
  31. overflowToDisk="true"
  32. />
  33. </ehcache>

在Spring托管的Hibernate二级缓存
1.在spring的配置文件中,hibernate部分加入 xml 代码 org.hibernate.cache.EhCacheProvider true
2.为HBM表设置cache策略 xml 代码
3.在DAO中,调用find方法查询之前,设置使用缓存 Java代码 getHibernateTemplate().setCacheQueries(true);

补充:
如果不设置“查询缓存”,那么Hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、
Iterator()、createCriteria()、createQuery()等方法获得的数据结果集的话,就需要设置
hibernate.cache.use_query_cache true 才行。

hibernate的一级和二级缓存的更多相关文章

  1. Hibernate的查询,二级缓存,连接池

    Hibernate的查询,二级缓存,连接池 1.Hibernate查询数据 Hibernate中的查询方法有5中: 1.1.Get/Load主键查询 使用get或者load方法来查询,两者之间的区别在 ...

  2. hibernate框架学习之二级缓存

    缓存的意义 l应用程序中使用的数据均保存在永久性存储介质之上,当应用程序需要使用数据时,从永久介质上进行获取.缓存是介于应用程序与永久性存储介质之间的一块数据存储区域.利用缓存,应用程序可以将使用的数 ...

  3. Mybatis一级、二级缓存

      Mybatis一级.二级缓存   一级缓存 首先做一个测试,创建一个mapper配置文件和mapper接口,我这里用了最简单的查询来演示. <mapper namespace="c ...

  4. hibernate框架学习之二级缓存(测试用例)

    HqlDemoApp.java package cn.itcast.h3.query.hql; import java.io.Serializable; import org.hibernate.Qu ...

  5. Hibernate 性能优化之二级缓存

    二级缓存是一个共享缓存,在二级缓存中存放的数据是共享数据特性     修改不能特别频繁     数据可以公开二级缓存在sessionFactory中,因为sessionFactory本身是线程安全,所 ...

  6. MyBatis 一级、二级缓存

    一级 默认session就有一级缓存,session有C/U/D操作或者session.clearCache();session.commit();都会清空缓存: 二级在mapper.xml中添加&l ...

  7. mybatis学习--缓存(一级和二级缓存)

    声明:学习摘要! MyBatis缓存 我们知道,频繁的数据库操作是非常耗费性能的(主要是因为对于DB而言,数据是持久化在磁盘中的,因此查询操作需要通过IO,IO操作速度相比内存操作速度慢了好几个量级) ...

  8. 【mybatis源码学习】mybtias一级,二级缓存

    转载:https://www.cnblogs.com/ysocean/p/7342498.html mybatis 为我们提供了一级缓存和二级缓存,可以通过下图来理解: ①.一级缓存是SqlSessi ...

  9. Hibernate 集成 Ehcache 开启二级缓存

    一.将 Ehcache.xml 放到 classpath 下 <?xml version="1.0" encoding="UTF-8"?> < ...

随机推荐

  1. java注解之二

    从JDK5开始,Java增加了Annotation(注解),Annotation是代码里的特殊标记,这些标记可以在编译.类加载.运行时被读取,并执行相应的处理.通过使用Annotation,开发人员可 ...

  2. Linux系统 awk sed R脚本 python脚本传入变量

    sed 传入变量: chrI="chr2";sed -n "/$chrI/p" clippointpos.csv  #变量用$var表示,把sed的单引号变为双 ...

  3. hihocoder Challenge 29 A.序列的值

    我现在就感觉我这人现在真的没有dp的意识 其实真写起来也不难,但是把就是练的少思维跟不上,dp从根本上就是一种状态的提炼和聚集. 按照题解的意思来,表示二进制第i位的值为j(0,1)的组合有多少,然后 ...

  4. Monkeyscript---获取包名主界面名和位置坐标

    一.monkey随机事件有三类:点击.输入.手势 二.Monkeyscript难点:如何获取坐标 三.Monkeyscript API: 1.轨迹球(手势)事件: DispatchTrackball( ...

  5. js中的0就是false,非0就是true及案例

    在处理js代码判断真假时经常会这么写. 但fun()可能得到的是数字0,这可不是表示的没有值,但是!js中的数字0就是false,非0就是true. 于是0就被无情的当做false了. 已经被这个坑过 ...

  6. freemarker处理map的数据(二十)

    1.简易说明 (1)map取值 (2)key取值 2.实现示例 <html> <head> <meta http-equiv="content-type&quo ...

  7. 消息中间件kafka+zookeeper集群部署、测试与应用

    业务系统中,通常会遇到这些场景:A系统向B系统主动推送一个处理请求:A系统向B系统发送一个业务处理请求,因为某些原因(断电.宕机..),B业务系统挂机了,A系统发起的请求处理失败:前端应用并发量过大, ...

  8. 【BZOJ2431】逆序对数列(动态规划)

    [BZOJ2431]逆序对数列(动态规划) 题面 Description 对于一个数列{ai},如果有i<j且ai>aj,那么我们称ai与aj为一对逆序对数.若对于任意一个由1~n自然数组 ...

  9. 【2016北京集训测试赛】azelso

    [吐槽] 首先当然是要orzyww啦 以及orzyxq奇妙顺推很强qwq 嗯..怎么说呢虽然说之前零零散散做了一些概d的题目但是总感觉好像并没有弄得比较明白啊..(我的妈果然蒟蒻) 这题的话可以说是难 ...

  10. jQuery中的自定义插件之----工厂方法(Factory Widget)

    jQuery赋予了我们很强大的插件自定义的功能,可以作为我们的武器库,应用到所有的网页中,使用的语法比较有意思,下面是对它的一些探讨. 遵循以下的原则: 1 IIFE 创建一个jQuery的scope ...