Hibernate默认二级缓存是不启动的,启动二级缓存(以EHCache为例)需要以下步骤:
1、添加相关的包:
Ehcache.jar和commons-logging.jar,如果hibernate.jar中含有ehcache就不用添加Ehcache.jar,commons-logging.jar是用来实现Ehcache写日志的。本示例使用Hibernate3.2
2、配置hibernate.cfg.xml文件
3、添加配置文件--ehcache.xml,一般放在classpath或src下,也可以自定义文件名和路径,并在hibernate.cfg.xml中通过 hibernate.cache.provider_configuration_file_resource_path参数指定。
其中:
maxElementsInMemory=“10000” //Cache中最多允许保存的数据对象的数量
external=“false” //缓存中对象是否为永久的,如果是,超时设置将被忽略,对象从不过期
timeToIdleSeconds=“1000” //缓存数据钝化时间(设置对象在它过期之前的空闲时间)
timeToLiveSeconds=“1000” //缓存数据的生存时间(设置对象在它过期之前的生存时间)
overflowToDisk=“false” /> //内存不足时,是否启用磁盘缓存
memoryStoreEvictionPolicy="LRU" //内存不足时数据对象的清除策略
ehcache中缓存的3种清空策略:
FIFO(first in first out):先进先出
LFU( Less Frequently Used):一直以来最少被使用的。如上面所讲,缓存的元素有一个hit属性,hit值最小的将会被清出缓存。
LRU(Least Recently Used):最近最少使用的,缓存的元素有一个时间戳,当缓存容量满了,而又需要腾出地方来缓存新的元素的时候,那么现有缓存元素中时间戳离当前时间最远的元素将被清出缓存。
4、配置相关实体的缓存策略
最后还是需要测试的。通过id缓存的例子如下:
Hibernate生成的sql语句:
Hibernate: select tuser0_.id as id0_0_, tuser0_.name as name0_0_ from cui_user tuser0_ where tuser0_.id=?
1---cuisea
2---cuisea
可见第二次读取TUser对象并没有去数据库查询,说明是从缓存里读取的,ehcache配置成功。
查询缓存(必须在hibernate.cfg.xml中配置hibernate.cache.use_query_cache为true)的例子如下:
Hibernate生成的sql语句:
Hibernate: select tuser0_.id as id0_, tuser0_.name as name0_ from cui_user tuser0_
1---tester
1---cuisea
2---tester
2---cuisea
可见,第二次查询并没有从数据库查询,而是从缓存中取数据。查询缓存使用hibernate生成的sql语句和参数作为key缓存起来,当执行相同的sql并使用相同参数时从缓存取数据。
关于在Hibernate下配置Ehcache可以参考官方文档http://ehcache.org/documentation/hibernate.html