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 的Ehache学习的更多相关文章

  1. Hibernate的系统 学习

    Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...

  2. Hibernate 马士兵 学习笔记 (转)

    目录(?)[+] 第2课 Hibernate UML图 第3课 风格 第4课 资源 第5课 环境准备 第6课 第一个示例Hibernate HelloWorld 第7课 建立Annotation版本的 ...

  3. JAVA框架之Hibernate框架的学习步骤

    首先介绍一下Java三大框架的关系 以CRM项目即客户关系管理项目示例 hibernate框架的学习路线: 1.学习框架入门,自己搭建框架,完成增删改查的操作 2.学习一级缓存,事物管理和基本查询 3 ...

  4. Hibernate二次学习一----------Hibernate简单搭建

    因为博客园自带的markdown不太好用,因此所有markdown笔记都使用cmd_markdown发布 Hibernate二次学习一----------Hibernate简单搭建: https:// ...

  5. ssh架构之hibernate(二)进阶学习

    1.JPA入门 JPA的认识:JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中Java持久层AP ...

  6. hibernate的简单学习(第一天)

    sql脚本: -- Create table drop table T_PERSON; create table T_PERSON ( id ) PRIMARY KEY, name ), passwo ...

  7. Hibernate入门篇<1>hibernate.cfg.xml学习小结

    Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性,这个配置文件应该位于应用程序或Web程序的类文件夹 classes中.Hibernate配置文件支持两种形式, ...

  8. Hibernate二次学习一----------搭建Hibernate

    目录 1. 项目结构 1.2 hibernate.cfg.xml 1.3 entity 1.4 entity.hbm.xml 2. 测试 3. 总结 © 版权声明:本文为博主原创文章,转载请注明出处 ...

  9. Hibernate二次学习二----------session.flush、session.doWork

    目录 1. session 2. session.flush 3. session.doWork 4. 完整代码 5. 总结 © 版权声明:本文为博主原创文章,转载请注明出处 1. session H ...

随机推荐

  1. poj 2096 Collecting Bugs && ZOJ 3329 One Person Game && hdu 4035 Maze——期望DP

    poj 2096 题目:http://poj.org/problem?id=2096 f[ i ][ j ] 表示收集了 i 个 n 的那个. j 个 s 的那个的期望步数. #include< ...

  2. MFC信号量使用指南

    DEMO程序:TestSemaphore_DEMO.rar 源代码:TestSemaphore_SRC.rar ---关键代码如下--- void CTestSemaphoreDlg::OnBnCli ...

  3. 使用JMeter代理服务器录制APP脚本

    重点:证书的安装,需要将Jmeter安装目录下证书传送到手机,使用手机安装(不要用QQ传送给手机,手机提示无法安装,可使用网盘方式传送,可成功安装证书) (出现该错误时,需安装证书) 简单的配置教程如 ...

  4. HttpUrlConnection使用详解--转

    http://blog.csdn.net/fightingXia/article/details/71775516 一,HttpURLconnection的介绍 在Android开发中网络请求是最常用 ...

  5. 小峰mybatis(3)mybatis分页和缓存

    一.mybatis分页-逻辑分页和物理分页: 逻辑分页: mybatis内置的分页是逻辑分页:数据库里有100条数据,要每页显示10条,mybatis先把100条数据取出来,放到内存里,从内存里取10 ...

  6. 实验十一 C的指针

    指针编程 11.1 #include<stdio.h> int main() { ]={,,,,,,,,,},i,*p,sum=; ],i=;i<;i++,p++) { ==) su ...

  7. Excel 公式CORREL算出相关系数

    当对 N 个主体中的每一个变量进行观测时,CORREL 工作表函数可计算两个测量变量之间的相关系数.(缺少任何主体的观测值将导致该主体在分析中被忽略.)当 N 个主体中的每一个均具备两个以上的测量变量 ...

  8. ASP.NET Web Pages:全局页面

    ylbtech-.Net-ASP.NET Web Pages:全局页面 1.返回顶部 1. ASP.NET Web Pages - 全局页面 本章介绍全局页面 AppStart 和 PageStart ...

  9. java study1

    java安装 java优势-跨平台:一次编写,到处运行. jdk开发工具包,提供了开发人员需要的开发工具.jdk中包含了jre jre java的运行环境,负责程序的运行,jre中,包含程序运行时需要 ...

  10. var abc = function(x){} 和 function abc(x){}的区别

    转自百度知道. 问:js里声明函数有几种方式? var abc = function(x){} 和 function abc(x){} 这两种声明方法有什么不同? 答:首先后者是指函数声明,前者是指函 ...