二级缓存的配置
来源:互联网 发布:windows 7主题 编辑:程序博客网 时间:2024/06/16 11:37
1) 导入第三方 缓存技术 jar包
ehcache-1.5.0.jar
依赖 backport-util-concurrent 和 commons-logging
2) 在hibernate.cfg.xml 开启二级缓存
<property name="hibernate.cache.use_second_level_cache">true</property>
3) 配置二级缓存技术提供商
<property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
4) 配置缓存数据对象并发策略
使用read-write 并发策略
方式一 在hbm文件配置
<class name="cn.itcast.domain.Customer" table="customers" catalog="hibernate3day4" >
<!-- 类级别缓存 -->
<cache usage="read-write"/>
<set name="orders" cascade="all-delete-orphan" inverse="true" >
<!-- 关联集合级别缓存 -->
<cache usage="read-write"/>
</set>
</class>
方式二 在cfg文件配置 (集中配置)
<!-- 类级别缓存 -->
<class-cache usage="read-write" class="cn.itcast.domain.Customer"/>
<class-cache usage="read-write" class="cn.itcast.domain.Order"/>
<!-- 集合缓存 -->
<collection-cache usage="read-write" collection="cn.itcast.domain.Customer.orders"/>
5) 在src中 配置 ehcache.xml
将 ehcache-1.5.0 jar包中 ehcache-failsafe.xml 改名 ehcache.xml 放入 src
测试二级缓存是否配置成功。
public class HibernateTest2 {@Test// 测试更新时间戳区域的使用public void demo6() {Session session = HibernateUtils.getCurrentSession();Transaction transaction = session.beginTransaction();// 数据被保存一级缓存 和 二级缓存Customer customer = (Customer) session.get(Customer.class, 1);// 通过hibernate程序,修改1号客户数据session.createQuery("update Customer set name ='kitty' where id = 1").executeUpdate(); // 不会通知二级缓存transaction.commit();// 自动关闭Sessionsession = HibernateUtils.getCurrentSession();transaction = session.beginTransaction();// 先查询二级缓存Customer customer2 = (Customer) session.get(Customer.class, 1);System.out.println(customer2);transaction.commit();// 自动关闭Session}
7、 理解类缓存区 数据存储特点
* 从二级缓存区 返回 数据每次 地址都是不同的 (散装数据 )
每次查询二级缓存,都是将散装数据 构造为一个新的对象
** get 、 load 方法都可以 读取二级缓存的数据 , Query 的 list方法只能存,不能取
8、 理解集合缓存区 数据存储特点
注释掉 <class-cache usage="read-write" class="cn.itcast.domain.Order"/> Order 类缓存
orders 集合无法缓存
* 集合缓存区 数据缓存 依赖 类缓存区 数据缓存
** 一级缓存的操作 会同步到二级缓存
9、 当内存缓存数据过多之后,需要将数据缓存到硬盘上
配置 src/ehcache.xml
* <diskStore path="java.io.tmpdir"/> 配置二级缓存硬盘临时目录位置
* <defaultCache <!-- 缓存属性配置 -->
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="120"
timeToLiveSeconds="120"
overflowToDisk="true"
maxElementsOnDisk="10000000"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="120"
memoryStoreEvictionPolicy="LRU"
/>
defaultCache , 是默认配置,该属性 对所有缓存数据 都有效
<cache name="cn.itcast.domain.Customer" // 自定义配置,该属性对cn.itcast.domain.Customer类缓存有效
maxElementsInMemory="10000" // 内存中最大对象数量 ,超过数量,数据会被缓存到硬盘
eternal="false" // 是否缓存为永久性 false 不永久
timeToIdleSeconds="120" // 闲置时间,超过时间回收
timeToLiveSeconds="120" // 存活时间,对象不管是否使用,到了时间回收
overflowToDisk="true" // 是否可以缓存到硬盘
maxElementsOnDisk="10000000" // 硬盘缓存最大对象数量
diskPersistent="false" // 当jvm结束时是否持久化对象 true false 默认是false
diskExpiryThreadIntervalSeconds="120" // 指定专门用于清除过期对象的监听线程的轮询时间
memoryStoreEvictionPolicy="LRU"
/>
10 、更新时间戳区域的作用
作用:记录数据最后更新时间,确保缓存数据是有效的
更新时间戳其余,记录数据最后更新时间,在使用二级缓存时,比较缓存时间t1 与 更新时间 t2 , 如果 t2 > t1 丢弃原来缓存数据,重新查询缓存
11、 Query的 iterate 方法
Query的iterate 方法返回 只有OID 代理对象
* 产生查询 id 的SQL 语句 select id from orders;
访问每个Order 具体数据时,再生成SQL 查询 ---- > N+1查询
***** batch-size 无法优化,使用 二级缓存优化
四、 查询缓存
有人称查询缓存 为hibernate 第三级缓存
* 二级缓存 缓存数据 都是类对象数据 ,数据都是缓存在 "类缓存区域"
二级缓存缓存PO类对象,条件(key)是id
如果查询条件不是id查询, 缓存数据不是PO类完整对象 =====> 不适合使用二级缓存
查询缓存: 缓存查询数据结果, key是查询生成SQL语句 , 查询缓存比二级缓存功能更加强大
配置查询缓存步骤
1、 配置二级缓存
2、 启用查询缓存 hibernate.cfg.xml
<property name="hibernate.cache.use_query_cache">true</property>
3、 必须在程序中指定使用查询缓存
query.setCacheable(true);
五、 二级缓存 性能监控
没有监测和性能参数而进行优化是毫无意义的。Hibernate 为其内部操作提供了一系列的示意
图,因此可以从 每个 SessionFactory抓取其统计数据。
SessionFactory 提供二级缓存监控方法,用来获得二级缓存命中次数
* Statistics getStatistics() 返回 Statistics 对象
Statistics 对象提供
* long getQueryCacheHitCount() 获取查询缓存命中次数
* long getQueryCacheMissCount() 获取查询缓存丢失次数
* long getSecondLevelCacheHitCount() 获取二级缓存命中次数
* long getSecondLevelCacheMissCount() 获取二级缓存丢失次数
二级缓存监控 设置hibernate属性
* 在配置期间,将 hibernate.generate_statistics设置为 true或 false
hitCount/(hitCount + missCount) = 命中率
查询二级缓存后,如果找到 hitCount +1 ,如果没找到 missCount+1 , 如果一级缓存找到了,就不会去查找二级缓存, hitCount、missCount 不变
=======================================================================================================================
六 、 继承关系映射
Hibernate 允许 将继承关系保存到 数据库中
1、 三种继承映射策略
第一种 subclass 父类和子类数据用同一张表保存,引入辨别者列,区分数据是父类数据还是子类数据
第二种 join-subclass 父类和子类 数据都是单独一张表,表之间通过外键 表示继承关系
第三种 unions-subclass(了解 ) 父类和子类 都是单独一张表,表之间没有任何 联系
2、 subclass 元素的继承映射
父类数据 和 子类数据 存放一张表,引入一列 辨别者列(区分数据是否父类还是子类)
1) 编写 Employee、HourEmployee、SalaryEmployee
2) 在继承关系模型中,只需要对父类编写hbm映射就可以了
<hibernate-mapping>
<class name="cn.itcast.subclass.Employee" table="employee" catalog="hibernate3day4" discriminator-value="ee">
<id name="id">
<generator class="identity"></generator>
</id>
<!-- 定义辨别者列 -->
<!-- 该列主要给Hibernate框架使用 -->
<discriminator column="etype"></discriminator>
<property name="name"></property>
<!-- 每个子类 使用 subclass元素配置 -->
<subclass name="cn.itcast.subclass.HourEmployee" discriminator-value="he">
<property name="rate"></property>
</subclass>
<subclass name="cn.itcast.subclass.SalaryEmployee" discriminator-value="se">
<property name="salary"></property>
</subclass>
</class>
</hibernate-mapping>
测试添加和查询
3、 joined-subclass 元素的继承映射
为父类数据和子类数据分布建表,公共信息放入父类表,个性信息放入子类表,通过外键关联
*** 使用继承映射,类关系不变的
<hibernate-mapping>
<class name="cn.itcast.joinedsubclass.Employee" table="employee" catalog="hibernate3day4" >
<id name="id">
<generator class="identity"></generator>
</id>
<property name="name"></property>
<!-- 为每个子类表编写 joined-subclass 元素 -->
<joined-subclass name="cn.itcast.joinedsubclass.HourEmployee" table="h_employee">
<!-- 配置子类表 外键 -->
<!-- eid 是 子类表主键,同时也是外键,引入父类表 id -->
<key column="eid"></key>
<property name="rate"></property>
</joined-subclass>
<joined-subclass name="cn.itcast.joinedsubclass.SalaryEmployee" table="s_employee">
<key column="eid"></key>
<property name="salary"></property>
</joined-subclass>
</class>
</hibernate-mapping>
*** 优先使用 joined-subclass, 如果类信息非常少,也可以使用 subclass
=======================================================================================================================
七、 集合映射
在一对多和 多对多中,都使用了集合 Set
* 使用Set集合,在hbm文件中 使用 <set> 配置 ,set集合是无序的,不允许重复
在实际开发中,经常会使用 有序的集合 List
在hbm中 使用 <bag> <list> <set>
Customer {
Set<Order> orders ; ------------> hbm <set> 不允许重复,无序
}
Customer {
List<Order> orders ; -----------> hbm <list> 允许重复,有序 <bag> 无序 ,允许重复
}
bag配置方法 (性能最好 ):
<hibernate-mapping>
<class name="cn.itcast.collectionmapping.Author" table="author">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="name"></property>
<!-- 一对多 -->
<bag name="articles">
<key column="author_id"></key>
<one-to-many class="cn.itcast.collectionmapping.Article"/>
</bag>
</class>
</hibernate-mapping>
list 配置方法:
原理: 在数据表中 保存数据下标 (维护有序性 )
<hibernate-mapping>
<class name="cn.itcast.collectionmapping.Author" table="author">
<id name="id">
<generator class="identity"></generator>
</id>
<property name="name"></property>
<list name="articles" cascade="all">
<key column="author_id"></key>
<!-- 生成列,article_index 维护顺序 -->
<list-index column="article_index"></list-index>
<one-to-many class="cn.itcast.collectionmapping.Article"/>
</list>
</class>
</hibernate-mapping>
+----+----------+-----------+---------------+
| id | title | author_id | article_index |
+----+----------+-----------+---------------+
| 1 | 天龙八部 | 1 | 0 |
| 2 | 笑傲江湖 | 1 | 1 |
+----+----------+-----------+---------------+
- hibernate二级缓存的配置
- hibernate二级缓存的配置
- hibernate的二级缓存配置
- Hibernate二级缓存的配置
- 二级缓存的配置
- hibernate二级缓存的配置
- Hibernate二级缓存的配置
- Mybatis的二级缓存配置
- Mybatis的二级缓存配置
- Mybatis的二级缓存配置
- hibernate二级缓存的配置
- Mybatis的二级缓存配置
- hibernate二级缓存的配置
- Hibernate的二级缓存的配置
- Hibernate的二级缓存的配置
- 配置二级缓存的主要步骤:
- Hibernate二级缓存的全局配置
- mybatis-mybatis二级缓存的配置
- 微软系统工具套件SysinternalsSuite各个工具功能说明
- USACO 1.2.3 Name That Number
- JavaScript 弹出登陆窗口背景半透明可拖动效果
- 360°全景影像优化建议
- 冒泡排序算法思想、C语言实现
- 二级缓存的配置
- PHP与MySQL
- 20130805
- <Error>: ImageIO: PNG invalid PNG file: iDOT doesn't point to valid IDAT chunk 解决
- POJ 1056 字典树
- Oracle免客户端安装(一)
- PHP数组基础
- UVA 11136 - Hoax or what (可以提交了,不会Submission error了)
- JVM学习笔记(四)------内存调优