hibernate_二级缓存(second cache)
2017-09-22 13:45
369 查看
适合用二级缓存的对象:
该对象读的次数远远大于写的次数. 如果每次读出来是为了写(即频繁写的对象),则不适合放入二级缓存.
因为如果一个经常写的对象放入二级缓存, hibernate 需要经常修改二级缓存里存放的该对象, 即锁住map, 其他线程就会锁在这, 性能差.
下面介绍二级缓存如何使用:
(1) 告诉hibernate 你使用哪个缓存框架( 以ehcache 为例 ), 在hibernate 配置文件中加这两句代码:
hibernate-release-5.2.10.Final \ lib\optional \ ehcache 目录下的所有jar 包.
(3)告诉hibernate 哪些类型的对象需要放入二级缓存:
到此, 二级缓存就使用上了. 如果你还想进行缓存分区( 即: 将指定数据放入指定的缓存地区. 类似于QQ会员一样), 按以下步骤即可实现:
1) 在ehcache.xml 中配置一个cache:
如果你需要统计二级缓存的使用信息( 便于跳转缓存策略 ), 可按以下步骤实现:
<1>在hibernate 配置文件中, 添加:
<property name="generate_statistics">true</property><2>在需要打印统计信息的地方调用以下方法( 其实就是通过SessionFactory 获取Statistics ):
//打印统计信息
private void printStatistics(){
SessionFactory factory = HibernateUtil.getInstance().getSessionFactory();
Statistics s = factory.getStatistics();
System.out.println("puts="+s.getSecondLevelCachePutCount());
System.out.println("hit="+s.getSecondLevelCacheHitCount());
System.out.println("miss="+s.getSecondLevelCacheMissCount());
System.out.println("-------------------------");
}扩展一点小知识:
如果使用的主键生成策略,在对象保存进数据库之前就可以确定主键, 则save() 会将对象放入二级缓存.
<generator class="native"/> 数据库生成主键,意味着对象只有在保存进数据库时才会确定主键.
下面介绍不同的缓存策略(即: usage 的值), 以及二级缓存和一级缓存的介绍:
该对象读的次数远远大于写的次数. 如果每次读出来是为了写(即频繁写的对象),则不适合放入二级缓存.
因为如果一个经常写的对象放入二级缓存, hibernate 需要经常修改二级缓存里存放的该对象, 即锁住map, 其他线程就会锁在这, 性能差.
下面介绍二级缓存如何使用:
(1) 告诉hibernate 你使用哪个缓存框架( 以ehcache 为例 ), 在hibernate 配置文件中加这两句代码:
<property name="cache.use_second_level_cache">true</property> <property name="cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>(2) 导入选定的缓存框架相应jar 包:
hibernate-release-5.2.10.Final \ lib\optional \ ehcache 目录下的所有jar 包.
(3)告诉hibernate 哪些类型的对象需要放入二级缓存:
<class-cache usage="read-write" class="cd.itcast.day5.cache.Employee"/>(4)将encache 的配置文件拷到类路径.(即: 将hibernate-release-5.2.10.Final \ project \ etc \ encache.xml 拷贝到src目录).
到此, 二级缓存就使用上了. 如果你还想进行缓存分区( 即: 将指定数据放入指定的缓存地区. 类似于QQ会员一样), 按以下步骤即可实现:
1) 在ehcache.xml 中配置一个cache:
<cache name="cditcast.employee" maxElementsInMemory="100" eternal="true" overflowToDisk="true" />2) 在hibernate配置文件中声明缓存地区的前缀(prefix):
<property name="cache.region_prefix">cditcast</property>3) 在告诉hibernate 指定对象需要放入二级缓存时, 指定放入的缓存地区:
<class-cache usage="read-write" class="cd.itcast.day5.cache.Employee" region="employee"/>
如果你需要统计二级缓存的使用信息( 便于跳转缓存策略 ), 可按以下步骤实现:
<1>在hibernate 配置文件中, 添加:
<property name="generate_statistics">true</property><2>在需要打印统计信息的地方调用以下方法( 其实就是通过SessionFactory 获取Statistics ):
//打印统计信息
private void printStatistics(){
SessionFactory factory = HibernateUtil.getInstance().getSessionFactory();
Statistics s = factory.getStatistics();
System.out.println("puts="+s.getSecondLevelCachePutCount());
System.out.println("hit="+s.getSecondLevelCacheHitCount());
System.out.println("miss="+s.getSecondLevelCacheMissCount());
System.out.println("-------------------------");
}扩展一点小知识:
如果使用的主键生成策略,在对象保存进数据库之前就可以确定主键, 则save() 会将对象放入二级缓存.
<generator class="native"/> 数据库生成主键,意味着对象只有在保存进数据库时才会确定主键.
下面介绍不同的缓存策略(即: usage 的值), 以及二级缓存和一级缓存的介绍:
相关文章推荐
- spring+hibernate+Jboss treeCache配置二级缓存(一)
- Hibernate 一级缓存(First-level cache)和二级缓存(second-level cache) 介绍
- hibernate二级缓存:hibernate3 2级缓存Cache的配置及测试
- hibernate二级缓存:hibernate3学习笔记( 2十一)| 2级缓存Cache
- EF 二级缓存 EFSecondLevelCache
- 【找集中式缓存做hibernate second level cache和业务缓存失败】
- hibernate中cache二级缓存问题
- 在hibernate中使用二级缓存的时候指定CacheConcurrencyStrategy.READ_WRITE修改后接着用for-each 或 iterator访问时报错ConcurrentMod
- hibernate二级缓存攻略 Ehcache
- hibernate的一级、二级和查询缓存问题
- Hibernate 4.2.4配置二级缓存的步骤
- Hibernate使用二级缓存时,createSQLQuery需要注意的问题
- Java面试原题:介绍一下hibernate的二级缓存
- hibernate一级缓存,二级缓存,查询缓存
- Hibernate 二级缓存
- Hibernate二级缓存详解
- Hibernate 之 二级缓存
- 说说自己对hibernate一级、二级、查询、缓存的理解。
- hibernate一级缓存和二级缓存的区别
- Hibernate的一级缓存与二级缓存的区别?