1)二级缓存(参考TestCache.test2())
默认关闭。属于SessionFactory级别缓存,可以被多个不Session对象访问。启用二级缓存后查找机制:
session查对象--->一级缓存查找(on)--->二级缓存查找(off)--->数据库查找.
a)二级缓存适用环境
该对象被多个不同请求频繁访问。
该对象数据状态基本不发生改变。
例如:当当网中查看产品详细页面功能。
b)二级缓存使用方法
二级缓存实现机制非常复杂,需要考虑缓存对象更新、对象命中率等问题,因此Hibernate采用了第三方提供的二级缓存组件。
ehcache.jar二级缓存组件的使用方法:
----引入ehcache.jar组件开发包
----在src下添加ehcache.xml配置文件,用于设置二级缓存组件管理参数。
<defaultCache
maxElementsInMemory="1000" //指定内存缓存对象的最大数量
eternal="false" //指定缓存的对象是否长期有效
timeToIdleSeconds="120"//指定对象空闲时间
timeToLiveSeconds="300"//指定对象存活时间
overflowToDisk="true"//指定超出缓存数量后,是否采用磁盘存储
/>
----在hibernate.cfg.xml配置中指定开启二级缓存,并指定采用哪个二级缓存组件
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">
true
</property>
<!-- 指定二级缓存组件 -->
<property name="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.EhCacheProvider
</property>
----哪些类型对象需要使用二级缓存,需要在hbm.xml中设置启用
<class name="tarena.entity.Order" table="d_order">
<cache usage="read-only" region="sampleCache1"/>
<id/>...
</class>
c)二级缓存的管理方法
sessionFactory.evict(类型或对象);//移除某一类型或某个对象
sessionFactory.evictCollection();//移除集合
2)查询缓存(参考TestCache.test3())
前面一级和二级缓存都只能缓存单个对象。如果查询的是字符串、数组或集合数据,需要使用查询缓存才可以缓存下来。
a)查询缓存适用的环境
同一个SQL频繁调用.
查询结果集数据很少改变
结果集数据量不要太大
例如当当网主界面左侧类别菜单功能比较适合。
b)查询缓存的使用方法
---开启二级缓存(参考前面步骤)
---在hibernate.cfg.xml中启用查询缓存配置
<!-- 指定开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">
true
</property>
---在query.list()调用之前设置启用查询缓存机制
query.setCacheable(true);//启用查询缓存机制
默认关闭。属于SessionFactory级别缓存,可以被多个不Session对象访问。启用二级缓存后查找机制:
session查对象--->一级缓存查找(on)--->二级缓存查找(off)--->数据库查找.
a)二级缓存适用环境
该对象被多个不同请求频繁访问。
该对象数据状态基本不发生改变。
例如:当当网中查看产品详细页面功能。
b)二级缓存使用方法
二级缓存实现机制非常复杂,需要考虑缓存对象更新、对象命中率等问题,因此Hibernate采用了第三方提供的二级缓存组件。
ehcache.jar二级缓存组件的使用方法:
----引入ehcache.jar组件开发包
----在src下添加ehcache.xml配置文件,用于设置二级缓存组件管理参数。
<defaultCache
maxElementsInMemory="1000" //指定内存缓存对象的最大数量
eternal="false" //指定缓存的对象是否长期有效
timeToIdleSeconds="120"//指定对象空闲时间
timeToLiveSeconds="300"//指定对象存活时间
overflowToDisk="true"//指定超出缓存数量后,是否采用磁盘存储
/>
----在hibernate.cfg.xml配置中指定开启二级缓存,并指定采用哪个二级缓存组件
<!-- 开启二级缓存 -->
<property name="hibernate.cache.use_second_level_cache">
true
</property>
<!-- 指定二级缓存组件 -->
<property name="hibernate.cache.provider_class">
net.sf.ehcache.hibernate.EhCacheProvider
</property>
----哪些类型对象需要使用二级缓存,需要在hbm.xml中设置启用
<class name="tarena.entity.Order" table="d_order">
<cache usage="read-only" region="sampleCache1"/>
<id/>...
</class>
c)二级缓存的管理方法
sessionFactory.evict(类型或对象);//移除某一类型或某个对象
sessionFactory.evictCollection();//移除集合
2)查询缓存(参考TestCache.test3())
前面一级和二级缓存都只能缓存单个对象。如果查询的是字符串、数组或集合数据,需要使用查询缓存才可以缓存下来。
a)查询缓存适用的环境
同一个SQL频繁调用.
查询结果集数据很少改变
结果集数据量不要太大
例如当当网主界面左侧类别菜单功能比较适合。
b)查询缓存的使用方法
---开启二级缓存(参考前面步骤)
---在hibernate.cfg.xml中启用查询缓存配置
<!-- 指定开启查询缓存 -->
<property name="hibernate.cache.use_query_cache">
true
</property>
---在query.list()调用之前设置启用查询缓存机制
query.setCacheable(true);//启用查询缓存机制