hibernate有一级缓存、二级缓存、查询缓存,一级缓存是session级别的缓存,是默认开启的.二级缓存是sessionFactory级别的缓存,需要手动开启,EhCache是hibernate二级缓存的默认缓存实现.查询缓存是相同的sql语句、相同的参数才会使用的缓存。下面介绍一下hibernate中的二级缓存。
1、 在hibernate配置文件中要开启二级缓存,:
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
2、指定ehcache配置文件路径:
<prop key="hibernate.cache.provider_configuration_file_resource_path">/ehcache.xml</prop>
3、ehcache.xml配置文件如下,配置文件要放到类路径下,以便系统能找得到:
<?xml version="1.0" encoding="UTF8"?>
<ehcache>
<!--
缓存到硬盘的路径
-->
<diskStore path="d:/ehcache"></diskStore>
<!--
默认设置
maxElementsInMemory : 在內存中最大緩存的对象数量。
eternal : 缓存的对象是否永远不变。
timeToIdleSeconds :可以操作对象的时间。
timeToLiveSeconds :缓存中对象的生命周期,时间到后查询数据会从数据库中读取。
overflowToDisk :内存满了,是否要缓存到硬盘。
-->
<defaultCache maxElementsInMemory="500000" eternal="false"
timeToIdleSeconds="36000" timeToLiveSeconds="86400" overflowToDisk="true">
</defaultCache>
</ehcache>
4、加入ehcache jar文件,这一步骤也可第一步就做,本人使用的是1.5.0版本,所以导入ehcache-1.5.0.jar,ehcache依赖slf4j-api、slf4j-jdk,所以也导入进来。
5、在实体类中采用注解形式配置缓存@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
开始测试,
项目中有代码this.agentDao.load(Agent.class,id); 发现第一次执行会发出sql语句,第二次直接没有发sql语句,说明二级缓存已经起作用了。注意,hibernate中list()方法查询时不会从缓存中查,始终会发出sql,但会把查出的对象放入缓存中。