Hibernate 的Ehache学习
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 的Ehache学习的更多相关文章
- Hibernate的系统 学习
Hibernate的系统 学习 一.Hibernate的介绍 1.什么是Hibernate? 首先,hibernate是数据持久层的一个轻量级框架.数据持久层的框架有很多比如:iBATIS,myBat ...
- Hibernate 马士兵 学习笔记 (转)
目录(?)[+] 第2课 Hibernate UML图 第3课 风格 第4课 资源 第5课 环境准备 第6课 第一个示例Hibernate HelloWorld 第7课 建立Annotation版本的 ...
- JAVA框架之Hibernate框架的学习步骤
首先介绍一下Java三大框架的关系 以CRM项目即客户关系管理项目示例 hibernate框架的学习路线: 1.学习框架入门,自己搭建框架,完成增删改查的操作 2.学习一级缓存,事物管理和基本查询 3 ...
- Hibernate二次学习一----------Hibernate简单搭建
因为博客园自带的markdown不太好用,因此所有markdown笔记都使用cmd_markdown发布 Hibernate二次学习一----------Hibernate简单搭建: https:// ...
- ssh架构之hibernate(二)进阶学习
1.JPA入门 JPA的认识:JPA全称Java Persistence API.JPA通过JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期的实体对象持久化到数据库中Java持久层AP ...
- hibernate的简单学习(第一天)
sql脚本: -- Create table drop table T_PERSON; create table T_PERSON ( id ) PRIMARY KEY, name ), passwo ...
- Hibernate入门篇<1>hibernate.cfg.xml学习小结
Hibernate配置文件主要用于配置数据库连接和Hibernate运行时所需的各种属性,这个配置文件应该位于应用程序或Web程序的类文件夹 classes中.Hibernate配置文件支持两种形式, ...
- Hibernate二次学习一----------搭建Hibernate
目录 1. 项目结构 1.2 hibernate.cfg.xml 1.3 entity 1.4 entity.hbm.xml 2. 测试 3. 总结 © 版权声明:本文为博主原创文章,转载请注明出处 ...
- Hibernate二次学习二----------session.flush、session.doWork
目录 1. session 2. session.flush 3. session.doWork 4. 完整代码 5. 总结 © 版权声明:本文为博主原创文章,转载请注明出处 1. session H ...
随机推荐
- vscode美化方法以及定制主题插件
首先是学会调整字体和字体大小 换成你看着舒服的字体和字体大小,当然,通常情况下默认的就很好看,但每个人的显示屏参数不同显示起来的效果因人而异,如果你有更好的方案不妨设置一下 下面展示我的浅色主题和深色 ...
- 解决在sass中使用calc不能包含变量的问题。
今天写sass的时候,发现在sass中使用calc,如果calc中包含一个变量,不会产生效果,看代码: .app-inner { display: flex; height: calc(100% - ...
- C++ static类成员,static类成员函数
转载:ZJE_ANDY static修饰类中成员,表示类的共享数据 1.static类成员 C++primer里面说过,static类成员不像普通的类数据成员,static类数据成员独立于一切类对象处 ...
- 样式学习--参照Oracle写法
#------------------------------------------------------------------------------- # Do not change the ...
- [UE4]单映射:TMap容器,字典表
一.TMap是什么 TMap是UE4中的一种关联容器,每个键都关联着一个值,形成了单映射关系.因此你可以通过键名来快速查找到值.此外,单映射要求每个键都是唯一的. 二.创建和填充单映射 如果你想创建一 ...
- keras开发成sklearn接口
我们可以通过包装器将Sequential模型(仅有一个输入)作为Scikit-Learn工作流的一部分,相关的包装器定义在keras.wrappers.scikit_learn.py中: 这里有两个包 ...
- Hive基础之Hive的复杂类型
ARRAY 一组有序字段,字段的类型必须相同.Array(1,2) create table hive_array(ip string, uid array<string>) row fo ...
- react 中state与props
react 中state与props 1.state与props props是只读属性,只有在组件被实例化的时候可以赋值,之后的任何时候都无法改变该值.如果试图修改该值时,控制台会报错 only re ...
- 蓝瓶的钙,好喝的钙——windows,我要蓝屏的
原文地址:http://80x86.io/post/windows-blue-screen-0x00000050-page_fault_in_nonpaged_area 这里只截取一部分. windo ...
- Jquery学习(二)
滚轮事件与函数节流 jquery.mousewheel插件使用 jquery中没有鼠标滚轮事件,原生js中的鼠标滚轮事件不兼容,可以使用jquery的滚轮事件插件jquery.mousewheel.j ...