该对象读的次数远远大于写的次数. 如果每次读出来是为了写(即频繁写的对象),则不适合放入二级缓存.
因为如果一个经常写的对象放入二级缓存, 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"/> 数据库生成主键,意味着对象只有在保存进数据库时才会确定主键.