Hibernate默认二级缓存是不启动的,启动二级缓存(以EHCache为例)需要以下步骤:

1、添加相关的包:

Ehcache.jar和commons-logging.jar,如果hibernate.jar中含有ehcache就不用添加Ehcache.jar,commons-logging.jar是用来实现Ehcache写日志的。本示例使用Hibernate3.2

2、配置hibernate.cfg.xml文件

  1. <hibernate-configuration>
  2. <session-factory>
  3. <property name="hibernate.show_sql">true</property>
  4. <property name="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.EhCacheProvider</property><!-- 指定cache实现类 -->
  5. <property name="cache.use_second_level_cache">true</property><!-- 启用二级缓存 -->
  6. <property name="hibernate.cache.use_query_cache">true</property><!-- 启用查询缓存 -->
  7. <!-- <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache2.xml</property>//指定ehcache配置文件 -->
  8. <mapping class="test.po.TUser" />
  9. </session-factory>
  10. </hibernate-configuration>

3、添加配置文件--ehcache.xml,一般放在classpath或src下,也可以自定义文件名和路径,并在hibernate.cfg.xml中通过 hibernate.cache.provider_configuration_file_resource_path参数指定。

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ehcache>
  3. <defaultCache maxElementsInMemory="10000"
  4. eternal="false"
  5. timeToIdleSeconds="1000"
  6. timeToLiveSeconds="1000"
  7. overflowToDisk="false"
  8. memoryStoreEvictionPolicy="LRU"/>
  9. </ehcache>

其中:

maxElementsInMemory=“10000” //Cache中最多允许保存的数据对象的数量
external=“false” //缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期 
timeToIdleSeconds=“1000”  //缓存数据钝化时间(设置对象在它过期之前的空闲时间)  
timeToLiveSeconds=“1000”  //缓存数据的生存时间(设置对象在它过期之前的生存时间)

overflowToDisk=“false” />    //内存不足时,是否启用磁盘缓存

memoryStoreEvictionPolicy="LRU" //内存不足时数据对象的清除策略

ehcache中缓存的3种清空策略:
 FIFO(first in first out):先进先出

LFU( Less Frequently Used):一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
 LRU(Least Recently Used):最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。

4、配置相关实体的缓存策略

  1. @Entity
  2. @Table(name="cui_user")
  3. @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)//可读可写
  4. public class TUser {
  5. private Integer id;
  6. private String name;
  7. @Id //标识主键
  8. @GeneratedValue(strategy=GenerationType.AUTO)//指定主键值的产生策略由Hibernate根据数据库字段选择
  9. public Integer getId() {
  10. return id;
  11. }
  12. public void setId(Integer id) {
  13. this.id = id;
  14. }
  15. public String getName() {
  16. return name;
  17. }
  18. public void setName(String name) {
  19. this.name = name;
  20. }
  21. }

最后还是需要测试的。通过id缓存的例子如下:

  1. public static void main(String[] args) {
  2. //单对象缓存
  3. Session session=HibernateSessionFactory.getSession();
  4. TUser user=(TUser)session.load(TUser.class, 200);
  5. System.out.println("1---"+user.getName());
  6. session.close();
  7. try {
  8. Thread.sleep(2000);//休眠2秒
  9. } catch (InterruptedException e) {
  10. e.printStackTrace();
  11. }
  12. session=HibernateSessionFactory.getSession();
  13. TUser user2=(TUser)session.load(TUser.class, 200);
  14. System.out.println("2---"+user2.getName());
  15. session.close();
  16. }

Hibernate生成的sql语句:

Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_ from cui_user tuser0_ where tuser0_.id=?
1---cuisea
2---cuisea

可见第二次读取TUser对象并没有去数据库查询,说明是从缓存里读取的,ehcache配置成功。

查询缓存(必须在hibernate.cfg.xml中配置hibernate.cache.use_query_cache为true)的例子如下:

  1. public static void main(String[] args) {
  2. Session session=HibernateSessionFactory.getSession();
  3. Query query=session.createQuery("from TUser");//使用Query缓存结果集
  4. query.setCacheable(true);//必须设置
  5. List<TUser> list=query.list();
  6. for (TUser user : list) {
  7. System.out.println("1---"+user.getName());
  8. }
  9. //另外开启一个事务
  10. session=HibernateSessionFactory.getSession();
  11. query=session.createQuery("from TUser");
  12. query.setCacheable(true);//必须设置
  13. list=query.list();
  14. for (TUser user : list) {
  15. System.out.println("2---"+user.getName());
  16. }
  17. }

Hibernate生成的sql语句:

Hibernate: select tuser0_.id as id0_, tuser0_.name as name0_ from cui_user tuser0_
1---tester
1---cuisea
2---tester
2---cuisea

可见,第二次查询并没有从数据库查询,而是从缓存中取数据。查询缓存使用hibernate生成的sql语句和参数作为key缓存起来,当执行相同的sql并使用相同参数时从缓存取数据。

Hibernate学习笔记之EHCache的配置的更多相关文章

  1. Hibernate学习笔记(二)

    2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...

  2. Hibernate学习笔记(一)

    2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...

  3. Hibernate 学习笔记一

    Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...

  4. Hibernate学习笔记-Hibernate HQL查询

    Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...

  5. thinkphp学习笔记4—眼花缭乱的配置

    原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...

  6. PHP学习笔记----IIS7下安装配置php环境

    原文:PHP学习笔记----IIS7下安装配置php环境 Php如何安装 Php版本的选择 Php在windows下的(php5.4.7)有两种版本: VC9 x86 Non Thread Safe ...

  7. OGG学习笔记02-单向复制配置实例

    OGG学习笔记02-单向复制配置实例 实验环境: 源端:192.168.1.30,Oracle 10.2.0.5 单实例 目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1. ...

  8. golang学习笔记8 beego参数配置 打包linux命令

    golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...

  9. Django:学习笔记(1)——开发环境配置

    Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...

随机推荐

  1. (转)assert()函数用法总结

    assert宏的原型定义在<assert.h>中,其作用是如果它的条件返回错误,则终止程序执行,原型定义: #include <assert.h>void assert( in ...

  2. 用户 IIS APPPOOL\DefaultAppPool 登录失败的解决方法

    解决方案  1.先查看你的网站使用的是哪个应用程序池 2.设置应用程序池的选项 3.标识选项 选LocalSystem或NetworkService就可以解决问题

  3. HTTP请求报文与响应报文

    http://docs.telerik.com/fiddler/KnowledgeBase/HTTP HTTP请求报文与响应报文 HTTP http://www.w3.org/Protocols/rf ...

  4. 比較Backbone.js, Angular.js, Ember.js, Knockout.js 心得

    還記得第一次寫網站的時候,我無意間寫成了 SPA(single page application),當時還沒有SPA這個詞,後來因為廣告主需要不同 url location 頁面的廣告展示,只好把部分 ...

  5. poj 3620 Avoid The Lakes(广搜,简单)

    题目 找最大的一片湖的面积,4便有1边相连算相连,4角不算. runtime error 有一种可能是 数组开的太小,越界了 #define _CRT_SECURE_NO_WARNINGS #incl ...

  6. HDU 3507 Print Article(斜率优化DP)

    题目链接 题意 : 一篇文章有n个单词,如果每行打印k个单词,那这行的花费是,问你怎么安排能够得到最小花费,输出最小花费. 思路 : 一开始想的简单了以为是背包,后来才知道是斜率优化DP,然后看了网上 ...

  7. Thread的第一天学习

    1.实现线程的方法: 1)extend Thread 2)implements Runnable 2.下面代码执行哪个run方法: new Thread( new Runnable(){ public ...

  8. 【转载】synchronized 与 Lock 的那点事

    最近在做一个监控系统,该系统主要包括对数据实时分析和存储两个部分,由于并发量比较高,所以不可避免的使用到了一些并发的知识.为了实现这些要求,后台使用一个队列作为缓存,对于请求只管往缓存里写数据.同时启 ...

  9. Hadoop格式化HDFS报错java.net.UnknownHostException: localhost.localdomain: localhost.localdomain

    异常描述: 在对HDFS格式化,执行hadoop namenode -format命令时,出现未知的主机名的问题,异常信息如下所示: [shirdrn@localhost bin]$ hadoop n ...

  10. 李洪强iOS开发之【零基础学习iOS开发】【01-前言】01-开篇

    从今天开始,我就开始更新[零基础学习iOS开发]这个专题.不管你是否涉足过IT领域,也不管你是理科生还是文科生,只要你对iOS开发感兴趣,都可以来阅读此专题.我尽量以通俗易懂的语言,让每个人都能够看懂 ...