1、首先设置ehcache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下:
| <?xml version="1.0" encoding="utf-8"?> <ehcache> <diskstore path="java.io.tmpdir"/> <defaultcache maxelementsinmemory="10000" <!-- 缓存最大数目 --> eternal="false" <!-- 缓存是否持久 --> overflowtodisk="true" <!-- 是否保存到磁盘,当系统当机时--> timetoidleseconds="300" <!-- 当缓存闲置n秒后销毁 --> timetoliveseconds="180" <!-- 当缓存存活n秒后销毁--> diskpersistent="false" diskexpirythreadintervalseconds= "120"/> </ehcache> |
2、在hibernate配置文件中设置:
| <!-- 设置hibernate的缓存接口类,这个类在hibernate包中 --> <property name="cache.provider_class">org.hibernate.cache.ehcacheprovider</property> <!-- 是否使用查询缓存 --> <property name="hibernate.cache.use_query_cache">true</property> 如果使用spring调用hibernate的sessionfactory的话,这样设置: <!--hibernatesession工厂管理 --> <bean id="sessionfactory" class="org.springframework.orm.hibernate3.localsessionfactorybean"> <property name="datasource"> <ref bean="datasource" /> </property> <property name="hibernateproperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.oracle9dialect</prop> <prop key="connection.provider_class">org.hibernate.connection.c3p0connectionprovider</prop> <prop key="hibernate.show_sql">true</prop> <prop key="hibernate.cache.use_query_cache">true</prop> <prop key="hibernate.cache.provider_class">org.hibernate.cache.ehcacheprovider</prop> </props> </property> <property name="mappingdirectorylocations"> <list> <value>/web-inf/classes/cn/rmic/manager/hibernate/</value> </list> </property> </bean> |
说明一下:如果不设置“查询缓存”,那么hibernate只会缓存使用load()方法获得的单个持久化对象,如果想缓存使用findall()、list()、iterator()、createcriteria()、createquery()等方法获得的数据结果集的话,就需要设置
hibernate.cache.use_query_cache true 才行
3、在hbm文件中添加<cache usage="read-only"/>
4、如果需要“查询缓存”,还需要在使用query或criteria()时设置其setcacheable(true);属性
5、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库
| package cn.rmic.hibernatesample; import java.util.list; import org.hibernate.cachemode; import org.hibernate.criteria; import org.hibernate.query; import org.hibernate.session; import cn.rmic.hibernatesample.hibernate.hibernatesessionfactory; import cn.rmic.manager.po.resources; public class testcacheselectlist ...{ /** *//** * @param args */ public static void main(string[] args) ...{ // todo auto-generated method stub session s=hibernatesessionfactory.getsession(); criteria c=s.createcriteria(resources.class); c.setcacheable(true); list l=c.list(); // query q=s.createquery("from resources r") // .setcacheable(true) // .setcacheregion("frontpages") ; // list l=q.list(); resources resources=(resources)l.get(0); system.out.println("-1-"+resources.getname()); hibernatesessionfactory.closesession(); try ...{ thread.sleep(5000); } catch (interruptedexception e) ...{ // todo auto-generated catch block e.printstacktrace(); } s=hibernatesessionfactory.getsession(); c=s.createcriteria(resources.class); c.setcacheable(true); l=c.list(); // q=s.createquery("from resources r").setcacheable(true) // .setcacheregion("frontpages"); // l=q.list(); resources=(resources)l.get(0); system.out.println("-2-"+resources.getname()); hibernatesessionfactory.closesession(); } } |
闽公网安备 35060202000074号