Hibernate的二级缓存功能是通过配置二级缓存插件来实现的,常用的二级缓存插件包括EHCache,OSCache,SwarmCache和JBossCache。本文主要介绍Hibernate缓存插件中EHCache配置。
1、引入EHCache相关jar包
net.sf.ehcache ehcache-core 2.4.3 org.springframework spring-context 4.1.4.RELEASE org.springframework spring-context-support 4.1.4.RELEASE org.hibernate hibernate-ehcache 4.3.8.Final
2、ehcache.xml配置
参数解释:
diskStore 缓存数据文件的存储目录
defaultCache 存的默认数据过期策略
cache 设置具体的命名缓存的数据过期策略
每个命名缓存代表一个缓存区域,命名缓存机制允许用户在每个类以及类的每个集合的粒度上设置数据过期策略;
在defaultCache元素中:
maxElementsInMemory属性设置缓存对象的最大数目;
eternal属性指定是否永不过期,true为不过期,false为过期;
timeToldleSeconds属性设置对象处于空闲状态的最大秒数;
timeToLiveSeconds属性设置对象处于缓存状态的最大秒数;
overflowToDisk属性设置内存溢出时是否将溢出对象写入硬盘;
3、config.properties文件配置
#hibernate confighibernate.dialect = org.hibernate.dialect.MySQLDialecthibernate.show_sql = truehibernate.format_sql = falsehibernate.hbm2ddl.auto = updatehibernate.cache.use_second_level_cache = truehibernate.cache.use_query_cache = truehibernate.cache.provider_configuration_file_resource_path = ehcache.xml#hibernate4 confighibernate.cache.region.factory_class = org.hibernate.cache.ehcache.EhCacheRegionFactory#hibernate3 config#hibernate.cache.provider_class = org.hibernate.cache.EhCacheProvider
4、spring-hibernate.xml文件配置,配置到sessionfactory标签当中
${hibernate.dialect} ${hibernate.show_sql} ${hibernate.format_sql} ${hibernate.hbm2ddl.auto} ${hibernate.cache.use_second_level_cache} ${hibernate.cache.region.factory_class} ${hibernate.cache.use_query_cache} ${hibernate.cache.provider_configuration_file_resource_path}
5、添加需要进行二级缓存的实体类注解
6、测试是否成功
Session session = sf.openSession(); session.beginTransaction();Listlist = (List )session.createQuery("from User").setCacheable(true).list();for(User u:list){ System.out.println(u.getName());}session.getTransaction().commit(); session.close(); System.out.println("-----------------分割线------------------");Session session2 = sf.openSession();session2.beginTransaction(); List list2 = (List )session2.createQuery("from User").setCacheable(true).list();for(User u:list2){ System.out.println(u.getName());}session2.getTransaction().commit(); session2.close();
说明:
需要使用查询缓存时,需要设置 setCacheable(true)
因为二级缓存是sessionfactory级别的缓存,可以跨域session进行调用,所以检验其是否成功运用了两个session。
第一个session使用查询缓存和list方式,查询出该表的所以实体信息,查询缓存将实体的id集合进行缓存,二级缓存则将其中的实体进行缓存。
第二个session执行同样的查询语句,所以直接从查询缓存中提取第一次查询结果集即实体id的集合,然后再根据实体id从二级缓存中提取实体信息,所以第二个session没有进行任何数据库操作。
执行结果:
二级缓存和查询缓存结果显示均成功。