http://chenhongbin007.blog.163.com/blog/static/3406992120094661950804/
转之方便自用。
- 二级缓存配置:
- 1、首先要打开二级缓存,在hibernate.cfg.xml中添加如下配置:
- <property name="hibernate.cache.use_second_level_cache">true</property>
- 2、Hibernate的二级缓存使用第三方的缓存工具来实现,所以我们需要指定Hibernate使用哪个
- 缓存工具。如下配置指定Hibernate使用EhCache缓存工具。
- <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
- 3、Hibernate在默认情况下并不会对所有实体对象进行缓存,所以,我们需要指定缓存哪些对象,
- 在实体对象的映射文件中(相应的<class>标签内部),添加如下配置:
- <cache usage="read-only"/>
- usage="read-only"是“只读”缓存策略。
- 注意,这个<cache>标签只能放在<class>标签的内部,而且必须处在<id>标签的前面!!!
- 这个<cache>标签放在哪些<class>标签下面,就说明会对这些类的对象进行缓存
- 4、对于第3步,有一个可选的方案是在hibernate.cfg.xml文件中指定哪些类的对象需要缓存,
- 而不需要使用<cache>标签来指定。如:
- 在hibernate.cfg.xml中添加如下配置:
- <class-cache class="com.bjsxt.hibernate.Classes" usage="read-only" />
- 注意,这个<class-cache>标签必须放在<mapping>标签的后面!!
- --------------------------------------------------------------------------------
- 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();
- }
- }