zoukankan      html  css  js  c++  java
  • Hibernate 二级缓存的配置及使用_EhCache

    大多数的应用程序中都会添加缓存模块,以减少数据库访问次数,同时增加响应速度。下面介绍一下hibernate的二级缓存。默认情况下hibernate的二级缓存是不开启的,我们需要手动配置并启用。

    注:

    (1)      本教程只是针对使用hibernate配置文件的情况,如果使用spring的orm则另行百度!

    (2)      本教程中实体类是xml的配置,如果实体类使用的是注解的形式,请自行查找实体类的注解形式配置缓存策略。

    (3)      本教程并没有将ehcache与spring整合,如果需要的话,请自行百度。

    1.选择hibernate缓存提供者(CacheProvider)

    Hibernate支持很多种缓存提供者(即缓存框架),例如ehcache,oscache,jbosscache等。Hibernate默认首选的缓存提供者是EhCache,下面我们将以ehchche为例进行配置。

    2.添加EhCache需要的jar包到项目目录lib下

    需要的jar包:ehcache-1.2.3.jar(包版本可选择最新的)

    3.添加Ehcache的配置文件:ehcache.xml

    a)        配置文件的名称为ehcache.xml

    b)        配置文件放到classpath下,即放到src目录下

    c)        下面是一些参数说明:

    [html] view plain copy
     
    1. <span style="white-space:pre">    </span>//缓存中最多可以存多少条数据  
    2. <span style="white-space:pre">    </span>maxElementsInMemory="3000"  
    3. <span style="white-space:pre">    </span>//缓存的数据是否一直有效  
    4. <span style="white-space:pre">    </span>eternal="false"  
    5. <span style="white-space:pre">    </span>//最大空闲时间,超过该值即被销毁  
    6.  <span style="white-space:pre">   </span>timeToIdleSeconds="120"  
    7. <span style="white-space:pre">    </span>//最大生存时间,超过该值即被销毁  
    8. <span style="white-space:pre">    </span>timeToLiveSeconds="1200"  
    9. <span style="white-space:pre">    </span>//如果内存不够,是不是可以放到磁盘  
    10. <span style="white-space:pre">    </span>overflowToDisk="true"  

    4.在hibernate的配置文件中指定开启二级缓存

    [html] view plain copy
     
    1. <span style="white-space:pre">    </span><property name="hibernate.cache.use_second_level_cache">true</property>  
    2.     <property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>  
    3.     <!-- hibernate.cache.use_query_cache是说明是否开启查询缓存,一般打开就好了 -->  
    4.     <property name="hibernate.cache.use_query_cache">true</property>  

    5.在实体类的配置文件中添加缓存策略

    在实体类的配置文件中的id标签前面(注意一定是前面)添加<cache usage="read-write"/>,这里是设定改实体类的缓存策略,当前设置的是可以对缓存的数据读或者写,还可以设置其他的缓存策略(具体问百度/Google)。不过一般情况可以设置read-write。

    到此为止已经配置完成!

    6.可自己写一个测试类,测试一下二级缓存是否已经生效。

    public voidtestAdd() {

          //在测试之前要在hibernate.cfg.xml中添加<property name="show_sql">true</property>,

          //意思是在控制台显示查询数据库的语句,如果有select ....,则表示该查询访问了数据库,反之如果没有打印select...语句,则表示数据是从缓存中加载出来的

          //初始化spring管理的bean

          ApplicationContextacf = newClassPathXmlApplicationContext("applicationContext.xml");

          //获取sessionFactory

          SessionFactorysf = (SessionFactory)acf.getBean("sessionFactory");

          //打开一个session

          Sessions1 = sf.openSession();

          s1.beginTransaction();

          //查询user表中的id是1的记录,并缓存到了二级缓存中。(注:如果只查询不使用查询的数据,则不会将数据保存到二级缓存)

          Useru = (User)s1.createQuery("from User whereid = 1").uniqueResult();

          //如果将System.out.println(u);注销掉将不会对上面的查询结果进行缓存

          System.out.println(u);

          //再打开一个session,与前一个session不是同一个session。意思是模拟不同的用户或者线程

          Sessions2 = sf.openSession();

          s2.beginTransaction();

          //用另外一种方法查询相同的数据

          Useru2 = (User)s2.get(User.class,1);

          System.out.println(u2);

          s1.close();

          s2.close();

       }

    测试结果:

    Hibernate: select user0_.id as id0_,user0_.name as name0_, user0_.password as password0_ from testregister.useruser0_ where user0_.id=1

    com.hbm.User@390e4fd7

    com.hbm.User@4463a1ae

    测试结果说明:我在测试程序中进行了两次查询,两次打印,但是在测试结果中只有一条查询语句,说明在第二次查询时没有发送查询语句(没有访问数据库),即在缓存中加载的数据。

    测试完成!

    说明:我没有测试查询缓存的作用,只是测试了二级缓存的作用。二者之间的关系可以理解为,如果二级缓存中有数据,则直接返回;如果没有,去缓存中加载;如果缓存中没有,则查询数据库。

    详细说明:

    二级缓存和查询缓存都相当于map形式:Key-Value。

    二级缓存是将查询出的数据放到缓存中,key是数据在数据库中的id值,

    查询缓存是将查询条件(可以是sql语句)和查询结果用Key-Value的方式将其保存到内存中,如果下一次查找条件与缓存的条件相同时,直接将结果返回。如果没有对应的Key值,但是程序使用了二级缓存,程序会先到二级缓存中查找对应的数据,如果有则返回,没有再去数据库查找。注:如果前面已经使用list(),且sql语句完全相同,则第二次查询时不需要发查询语句,其他情况使用list(),将至少发送一条查询语句,为了查询当前查询结果的主键,然后会从二级缓存中查找对应的数据,如果没有数据,则会查找数据库。

  • 相关阅读:
    vuex介绍
    javascript => 方法的简写形式
    Maven学习----dependencies与dependencyManagement的区别(转)
    php加载xml编码错误,“Error: Input is not proper UTF-8, indicate encoding! ”
    SQLSERVER---- 通过位运算更改标志位
    TP框架中用tp模版迁移smarty模版的注意事项
    Maven学习----Dependency scope
    maven常见异常以及解决方法
    XAMPP部署
    自定义JS插件
  • 原文地址:https://www.cnblogs.com/muliu/p/6148333.html
Copyright © 2011-2022 走看看