大多数的应用程序中都会添加缓存模块,以减少数据库访问次数,同时增加响应速度。下面介绍一下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)        下面是一些参数说明:

  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的配置文件中指定开启二级缓存

  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(),将至少发送一条查询语句,为了查询当前查询结果的主键,然后会从二级缓存中查找对应的数据,如果没有数据,则会查找数据库。

Hibernate 二级缓存的配置及使用_EhCache的更多相关文章

  1. ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存

    ssh整合hibernate 使用spring管理hibernate二级缓存,配置hibernate4.0以上二级缓存 hibernate  : Hibernate是一个持久层框架,经常访问物理数据库 ...

  2. hibernate二级缓存ehcache hibernate配置详解

    <!-----------------hibernate二级缓存ehcache------------------------->hibernate配置 <prop key=&quo ...

  3. 配置Hibernate二级缓存时,不能初始化RegionFactory的解决办法

    配置Hibernate 二级缓存时,出现以下bug提示: SLF4J: Failed to load class "org.slf4j.impl.StaticLoggerBinder&quo ...

  4. Hibernate的一级二级缓存机制配置与测试

    特别感谢http://www.cnblogs.com/xiaoluo501395377/p/3377604.html 在本篇随笔里将会分析一下hibernate的缓存机制,包括一级缓存(session ...

  5. 配置Hibernate二级缓存步骤

    配置Hibernate二级缓存步骤: 加入二级缓存的jar包及配置文件 jar包位置:hibernate-release-4.1.8.Final\lib\optional\ehcache下所有jar包 ...

  6. Hibernate 二级缓存配置

    详见:https://www.cnblogs.com/Junsept/p/7324981.html Hibernate的cache管理: Cache就是缓存,它往往是提高系统性能的最重要手段,对数据起 ...

  7. Hibernate学习11——配置Hibernate二级缓存

    一.缓存的概念: 以空间换时间:   二.Hibernate缓存的分类: 前面我们讲的缓存都是session缓存:也叫一级缓存:get,load等缓存都是内置的,一级缓存: SessionFactor ...

  8. Hibernate ——二级缓存

    一.Hibernate 二级缓存 1.Hibernate 二级缓存是 SessionFactory 级别的缓存. 2.二级缓存分为两类: (1)Hibernate内置二级缓存 (2)外置缓存,可配置的 ...

  9. Hibernate <二级缓存>

    二级缓存: 定义: 1.二级缓存被称为进程级缓存或者sessionFactory级缓存,二级缓存可以被所有session共享 2.二级缓存的生命周期和sessionFactory生命周期一样(sess ...

随机推荐

  1. POJ 2478 Farey Sequence

     名字是法雷数列其实是欧拉phi函数              Farey Sequence Time Limit: 1000MS   Memory Limit: 65536K Total Submi ...

  2. STM32f103之外部中断

    一.背景 有个需求,IO口检测上升沿,然后做相应的动作.在此记录STM32F103的外部中断结构及配置方法, 以备下次快速上手使用. 有许多不太明白,又是老司机(:-D)帮忙,真的是站在别人的肩膀上会 ...

  3. 【Alpha版本】项目总结

    我说的都队 031402304 陈燊 031402342 许玲玲 031402337 胡心颖 031402203 陈齐民 031402209 黄伟炜 031402233 郑扬涛 031402341 王 ...

  4. phpstorm的使用教程

    1.设置行号:file->settings->Editor->Appearance->Show line numbers 2.设置字体和背景 :file->setting ...

  5. stack.sh failing giving error "g-api did not start"

    same issue i faced , tried with ./unstack.sh and ./clean.sh also but couldn't fix the issue.Followin ...

  6. HikariCP

    HiKariCP是数据库连接池的一个后起之秀,号称性能最好,可以完美地PK掉其他连接池. 为何要使用HiKariCP?这要先从BoneCP说起: 什么?不是有C3P0/DBCP这些成熟的数据库连接池吗 ...

  7. request \response 总结

    request&response request 1.获得信息的方法     1> 获得请求首行信息的方法         *getMethod         *getContextP ...

  8. October 23rd Week 44th Sunday 2016

    When ambition ends, happiness begins. 野心消亡之日,正是快乐破茧之时. No ambition, no annoyance. No ambition, no ac ...

  9. union和union all 合并查询

    union联合查询 SELECT TOP ID,oTitle Title,oInfo Description,Pic Images AND UpTime > dateadd(day,-,UpTi ...

  10. c语言中(*p)[n]和*p[n]的区别

    写于2016年12月5日. c语言中(*p)[n]表示的数组指针,在该表达式中按照运算的优先级,首先计算()的中*p,在和[n]计算.含义为指向含有n个元素的一维数组. *p[n]表示的是指针数组,在 ...