zoukankan      html  css  js  c++  java
  • hibernate的一级和二级缓存

    一级缓存就是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.  
    3. <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"  
    4. "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
    5. <hibernate-mapping> 
    6. <class name="org.qiujy.domain.cachedemo.Category" table="categories"> 
    7.  
    8. //配置缓存,必须紧跟在class元素后面对缓存中的Category对象采用读写型的并发访问策略  
    9.  
    10. <cache usage="read-write"/> 
    11.  
    12. <id name="id" type="java.lang.Long"> 
    13. <column name="id" /> 
    14. <generator class="native" /> 
    15. </id> 
    16. <!-- 配置版本号,必须紧跟在id元素后面 --> 
    17. <version name="version" column="version" type="java.lang.Long" /> 
    18.  
    19. <property name="name" type="java.lang.String"> 
    20. <column name="name" length="32" not-null="true"/> 
    21. </property> 
    22.  
    23. <property name="description" type="java.lang.String"> 
    24. <column name="description" length="255"/> 
    25. </property> 
    26.  
    27. <set name="products" table="products" cascade="all" inverse="true"> 
    28.  
    29. <cache usage="read-write"/> 
    30.  
    31. <key column="categoryId" not-null="true"/> 
    32. <one-to-many class="org.qiujy.domain.cachedemo.Product"/> 
    33. </set> 
    34.  
    35. </class> 
    36. </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.  
    7. <cache usage="read-write"/> 
    8.  
    9. <id name="id" type="java.lang.Long"> 
    10. <column name="id" /> 
    11. <generator class="native" /> 
    12. </id> 
    13. <!-- 配置版本号,必须紧跟在id元素后面 --> 
    14. <version name="version" column="version" type="java.lang.Long" /> 
    15.  
    16. <property name="name" type="java.lang.String"> 
    17. <column name="name" length="32" not-null="true"/> 
    18. </property> 
    19.  
    20. <property name="description" type="java.lang.String"> 
    21. <column name="description" length="255"/> 
    22. </property> 
    23.  
    24. <property name="unitCost" type="java.lang.Double"> 
    25. <column name="unitCost" /> 
    26. </property> 
    27.  
    28. <property name="pubTime" type="java.util.Date"> 
    29. <column name="pubTime" not-null="true" /> 
    30. </property> 
    31.  
    32. <many-to-one name="category" 
    33. column="categoryId" 
    34. class="org.qiujy.domain.cachedemo.Category" 
    35. cascade="save-update" 
    36. not-null="true"> 
    37. </many-to-one> 
    38.  
    39. </class> 
    40. </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.  
    11. <!-- 设置Category类的缓存的数据过期策略 --> 
    12. <cache name="org.qiujy.domain.cachedemo.Category" 
    13. maxElementsInMemory="100" 
    14. eternal="true" 
    15. timeToIdleSeconds="0" 
    16. timeToLiveSeconds="0" 
    17. overflowToDisk="false" 
    18. /> 
    19.  
    20. <!-- 设置Category类的products集合的缓存的数据过期策略 --> 
    21. <cache name="org.qiujy.domain.cachedemo.Category.products" 
    22. maxElementsInMemory="500" 
    23. eternal="false" 
    24. timeToIdleSeconds="300" 
    25. timeToLiveSeconds="600" 
    26. overflowToDisk="true" 
    27. /> 
    28.  
    29. <cache name="org.qiujy.domain.cachedemo.Product" 
    30. maxElementsInMemory="500" 
    31. eternal="false" 
    32. timeToIdleSeconds="300" 
    33. timeToLiveSeconds="600" 
    34. overflowToDisk="true" 
    35. /> 
    36.  
    37. </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 才行。

  • 相关阅读:
    第八周学习进度
    《梦断代码》阅读笔记01
    冲刺记录一
    NABCD简介
    第七周学习进度
    《编程珠玑》阅读笔记03
    第六周学习进度
    数据库数据定期同步实现
    数据库之间的数据同步
    数据同步——otter
  • 原文地址:https://www.cnblogs.com/hanxue112253/p/3874938.html
Copyright © 2011-2022 走看看