Hibernate学习笔记之EHCache的配置
Hibernate默认二级缓存是不启动的,启动二级缓存(以EHCache为例)需要以下步骤:
1、添加相关的包:
Ehcache.jar和commons-logging.jar,如果hibernate.jar中含有ehcache就不用添加Ehcache.jar,commons-logging.jar是用来实现Ehcache写日志的。本示例使用Hibernate3.2
2、配置hibernate.cfg.xml文件
- <hibernate-configuration>
- <session-factory>
- <property name="hibernate.show_sql">true</property>
- <property name="hibernate.cache.provider_class"> net.sf.ehcache.hibernate.EhCacheProvider</property><!-- 指定cache实现类 -->
- <property name="cache.use_second_level_cache">true</property><!-- 启用二级缓存 -->
- <property name="hibernate.cache.use_query_cache">true</property><!-- 启用查询缓存 -->
- <!-- <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache2.xml</property>//指定ehcache配置文件 -->
- <mapping class="test.po.TUser" />
- </session-factory>
- </hibernate-configuration>
3、添加配置文件--ehcache.xml,一般放在classpath或src下,也可以自定义文件名和路径,并在hibernate.cfg.xml中通过 hibernate.cache.provider_configuration_file_resource_path参数指定。
- <?xml version="1.0" encoding="UTF-8"?>
- <ehcache>
- <defaultCache maxElementsInMemory="10000"
- eternal="false"
- timeToIdleSeconds="1000"
- timeToLiveSeconds="1000"
- overflowToDisk="false"
- memoryStoreEvictionPolicy="LRU"/>
- </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、配置相关实体的缓存策略
- @Entity
- @Table(name="cui_user")
- @Cache(usage=CacheConcurrencyStrategy.READ_WRITE)//可读可写
- public class TUser {
- private Integer id;
- private String name;
- @Id //标识主键
- @GeneratedValue(strategy=GenerationType.AUTO)//指定主键值的产生策略由Hibernate根据数据库字段选择
- public Integer getId() {
- return id;
- }
- public void setId(Integer id) {
- this.id = id;
- }
- public String getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- }
最后还是需要测试的。通过id缓存的例子如下:
- public static void main(String[] args) {
- //单对象缓存
- Session session=HibernateSessionFactory.getSession();
- TUser user=(TUser)session.load(TUser.class, 200);
- System.out.println("1---"+user.getName());
- session.close();
- try {
- Thread.sleep(2000);//休眠2秒
- } catch (InterruptedException e) {
- e.printStackTrace();
- }
- session=HibernateSessionFactory.getSession();
- TUser user2=(TUser)session.load(TUser.class, 200);
- System.out.println("2---"+user2.getName());
- session.close();
- }
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)的例子如下:
- public static void main(String[] args) {
- Session session=HibernateSessionFactory.getSession();
- Query query=session.createQuery("from TUser");//使用Query缓存结果集
- query.setCacheable(true);//必须设置
- List<TUser> list=query.list();
- for (TUser user : list) {
- System.out.println("1---"+user.getName());
- }
- //另外开启一个事务
- session=HibernateSessionFactory.getSession();
- query=session.createQuery("from TUser");
- query.setCacheable(true);//必须设置
- list=query.list();
- for (TUser user : list) {
- System.out.println("2---"+user.getName());
- }
- }
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的配置的更多相关文章
- Hibernate学习笔记(二)
2016/4/22 23:19:44 Hibernate学习笔记(二) 1.1 Hibernate的持久化类状态 1.1.1 Hibernate的持久化类状态 持久化:就是一个实体类与数据库表建立了映 ...
- Hibernate学习笔记(一)
2016/4/18 19:58:58 Hibernate学习笔记(一) 1.Hibernate框架的概述: 就是一个持久层的ORM框架. ORM:对象关系映射.将Java中实体对象与关系型数据库中表建 ...
- Hibernate 学习笔记一
Hibernate 学习笔记一 今天学习了hibernate的一点入门知识,主要是配置domain对象和表的关系映射,hibernate的一些常用的配置,以及对应的一个向数据库插入数据的小例子.期间碰 ...
- Hibernate学习笔记-Hibernate HQL查询
Session是持久层操作的基础,相当于JDBC中的Connection,通过Session会话来保存.更新.查找数据.session是Hibernate运作的中心,对象的生命周期.事务的管理.数据库 ...
- thinkphp学习笔记4—眼花缭乱的配置
原文:thinkphp学习笔记4-眼花缭乱的配置 1.配置类别 ThinkPHP提供了灵活的全局配置功能,ThinkPHP会依次加载管理配置>项目配置>调试配置>分组配置>扩展 ...
- PHP学习笔记----IIS7下安装配置php环境
原文:PHP学习笔记----IIS7下安装配置php环境 Php如何安装 Php版本的选择 Php在windows下的(php5.4.7)有两种版本: VC9 x86 Non Thread Safe ...
- OGG学习笔记02-单向复制配置实例
OGG学习笔记02-单向复制配置实例 实验环境: 源端:192.168.1.30,Oracle 10.2.0.5 单实例 目标端:192.168.1.31,Oracle 10.2.0.5 单实例 1. ...
- golang学习笔记8 beego参数配置 打包linux命令
golang学习笔记8 beego参数配置 打包linux命令 参数配置 - beego: 简约 & 强大并存的 Go 应用框架https://beego.me/docs/mvc/contro ...
- Django:学习笔记(1)——开发环境配置
Django:学习笔记(1)——开发环境配置 Django的安装与配置 安装Django 首先,我们可以执行python -m django --version命令,查看是否已安装django. 如果 ...
随机推荐
- android动态增加控件时控制样式的方法
在学习android的动画时,发现所谓的tween动画只是改变绘制效果并不改变原控件的位置时是颇为失望的,虽然3.0之后已经有了property animation,但是由于要兼容老版本的androi ...
- EntityFramework Add方法与Attach区别
一 先发问. 问题:在使用EF过程中,能否有一个方法可以直接执行传入的SQL语句.纠结的只找到了调用存储过程的方法,难道要SqlHelper.cs? 二 友情提示 本文内容参考自MSDN. 三 ...
- unable to start within 45 seconds. If the server requires more time, try increasing the timeout in the server editor
eclipse启动项目时,提示超时: 解决方案: 修改 workspace\.metadata\.plugins\org.eclipse.wst.server.core\servers.xml文件. ...
- css块级元素、行内元素
说说对html页面元素的排列认识: html中所有元素从上到下排列,所以需要css来对其中的元素进行排序.调节样式,并用js为其添加交互效果. css的排序.定位是相对块级元素而言的,margin/p ...
- hdu 4869
一个机智题,可惜比赛的时候没有机智出来 #include<cstdio> #include<cstring> #include<cmath> #include< ...
- PHP流程控制的替代语法
准备做个wordpress的主题,结果看到了如下的语法: <div id="primary" class="content-area"><ma ...
- jQuery1.9.1源码分析--Animation模块
var fxNow, // 使用一个ID来执行动画setInterval timerId, rfxtypes = /^(?:toggle|show|hide)$/, // eg: +=30.5px / ...
- Unity3D Development模式下的一个小问题
今天客户提交了一个反馈,说测试版本的应用在按下电源键的时候屏幕变黑,然后重新按下电源键启动的时候发现没有出现屏幕锁屏的情况,直接回到应用界面. 我这边看了一下,发现如果装了360之类的手机助手就没这个 ...
- eclipse 开发技巧
1. ctrl+shift+r:打开资源 这可能是所有快捷键组合中最省时间的了.这组快捷键可以让你打开你的工作区中任何一个文件,而你只需要按下文件名或mask名中的前几个字母,比如applic*.xm ...
- django在nginx uwsgi和tornado异步方案在项目中的体验
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://rfyiamcool.blog.51cto.com/1030776/1397495 ...