大多数的应用程序中都会添加缓存模块,以减少数据库访问次数,同时增加响应速度。下面介绍一下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. JavaScript类型判断instanceof与typeof对比

    经常有人会在JavaScript里写如下的方法: function checkType() { var s1 = 123; var s2 = "OK"; if (s1 instan ...

  2. 第3月第2天 find symbolicatecrash 生产者-消费者 ice 引用计数

    1.linux find export find /Applications/Xcode.app/ -name symbolicatecrash -type f export DEVELOPER_DI ...

  3. DAY6 使用ping钥匙临时开启SSH:22端口,实现远程安全SSH登录管理就这么简单

    设置防火墙策略时,关于SSH:22访问权限,我们常常会设置服务器只接受某个固定IP(如公司IP)访问,但是当我们出差或在家情况需要登录服务器怎么办呢? 常用两种解决方案:1.通过VPN操作登录主机: ...

  4. and or bool and a or b 原理解释

    python 中的and从左到右计算表达式,若所有值均为真,则返回最后一个值,若存在假,返回第一个假值. or也是从左到有计算表达式,返回第一个为真的值. 代码如下: IDLE 1.2.4>&g ...

  5. Python系统命令操作

    系统命令 1.call 执行命令,返回状态码 ret = subprocess.call(['ls', '-l'], shell=False) ret = subprocess.call('ls -l ...

  6. python——连接MySQL数据库

    都是照着说明文档来的,主要是为了以后忘记了能快一点想起来. 1. 连接 安装MySQL的时候,自动按照了Python的模块,如果没有的话,也可以在官网下载. 看什么都不如看代码来得快: import ...

  7. Microsoft.AspNet.SignalR 2.2

    Nuget :http://www.nuget.org/packages/Microsoft.AspNet.SignalR/ What is SignalR? ASP.NET SignalR is a ...

  8. RobotFrameWork(三)数据类型

    1.1 数字变量 执行结果: 1.2 布尔变量和None/null 执行结果: 1.3 字符串.元组.list和字典 执行结果: 1.4 space和empty 执行结果:

  9. Effective C++阅读笔记_条款2:尽量以const,enum,inline替换#define

    1.#define缺点1 #define NUM 1.2 记号NUM可能没有进入记号表,在调试或者错误信息中,无法知道1.2的含义. 改善:通过const int NUM = 1.2; 2.#dein ...

  10. 去哪儿网输入框三种输入方式(selenium webdriver 干货)

    在机票预定的页面,输入出发城市和到达城市输入框的时候, 发现直接使用sendkeys不好使, 大部分情况出现输入某城市后没有输入进去, 经过几天的研究,发现可以采取三种方式: 1. 先点击输入框,待弹 ...