您的位置:首页 > 其它

hibernate_二级缓存(second cache)

2017-09-22 13:45 369 查看
适合用二级缓存的对象:
该对象读的次数远远大于写的次数. 如果每次读出来是为了写(即频繁写的对象),则不适合放入二级缓存.

因为如果一个经常写的对象放入二级缓存, 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 的值), 以及二级缓存和一级缓存的介绍:





内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息