• 关于hibernate的cache总结及并发问题


    缓存按应用范围可分为三类:

    事物级缓存即一级缓存session缓存:

             存储的当前session相关联java对象

                      session缓存称为hibernate的一级缓存

             应用级缓存即二级缓存sessionFactory:

                       二级缓存根据目的和功能又可分为内置缓存和外置缓存。

                       内置缓存放置的是映射元数据和预定义SQL语句,内置缓存是只读的,不可修改。

                       外置缓存是一个可配置的插件,在默认情况hibernate不会开启这个插件。

                       外置缓存的存储介质是内存或硬盘。

                       SessionFactory的外置缓存被称为hibernate的二级缓存。

          hibernate本身只提供二级缓存的规范,有第三方插件做具体实现。EHCache。

          二级缓存存储的对象分为:

            类对象

            集合对象

            query查询对象

            集群范围缓存

    EHCache缓存在hibernate中的使用;

       1.在主配置文件中要开启二级缓存:

                 <property name="hibernate.cache.use_second_level_cache">true</property>

       2.在主配置文件配置二级缓存区工厂:

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

       3.指定缓存对象(可在映射关系中配置也可在主配置文件中配置)

             0.导入Jar包和配置文件

              

             1.<class-cache usage="read-only" class="指定的对象类"/>(主配置文件中配置)

             2. <collection-cache usage="read-only" collection="指定的集合对象"/>(主配置文件中配置)

    <!-- 指定类缓存集合 -->
    <class-cache usage="read-only" class="com.layne.beans.Minister"/>
    <class-cache usage="read-only" class="com.layne.beans.Country"/>
    <!-- 指定集合缓存集合 -->
    <collection-cache usage="read-only" collection="com.layne.beans.Country.ministers"/>

    在映射关系配置文件中配置

     <class name="Country">
               <!-- 指定当前类为类缓存对象 -->
               <!-- <cache usage="read-only"/> -->
               <id name="cid">
                  <generator class="native"></generator>
               </id>
               <property name="cname"/>
               <!-- 对关系关联映射关系 -->
               <set name="ministers" cascade="save-update" inverse="false">
                  <!-- 指定当前集合为缓存对象 -->
                 <!--  <cache usage="read-only"/> -->
                  <key column="countryId"/>
                  <one-to-many class="Minister"/>
               </set>
         </class>

           3.配置query查询缓存对象

            在主配置文件中开启query缓存:<property name="hibernate.cache.use_query_cache">true</property>

               query查询的结果也是可以存到一二级缓存中,但Query查询默认不会从缓存中读取数据     

                要使用Query读取缓存数据
               1.在Hibernate.cfg.xml配置hibernate.cache.use_query_cache为true
               2.要在Query语句添加 setCacheable(true):

                         Country country= (Country) session.createQuery(hql).setCacheable(true).uniqueResult();

    Session的刷新与同步

         Session的刷新是指,Session缓存中数据的更新。

        Session的同步是指,将Session缓存中的数据同步更行到DB中。

        执行同步的时间点只有一个:事物的提交。

        刷新的时间点有三个:1.执行Query查询 2.执行Session.flush() 3.执行事物的提交

        当代码中执行了对Session中现有数据的修改操作,即update()与delete()语句后,

                Session缓存并不会马上刷新。即并不会马上执行update与delete的SQL语句。

  • 相关阅读:
    使用Mockito进行单元测试【2】—— stub 和 高级特性[转]
    使用Mockito进行单元测试【1】——mock and verify[转]
    一个更加简洁的 建造者模式
    建造者模式
    另一种 模板模式
    模板模式
    适配器模式的另一种解释
    适配器模式
    迭代器模式
    迭代器模式 循环数组
  • 原文地址:https://www.cnblogs.com/flytogalaxy/p/7473582.html
Copyright © 2020-2023  润新知