Hibernate性能优化(二)

Hibernate的缓存优化
1、首先设置EhCache,建立配置文件ehcache.xml,默认的位置在class-path,可以放到你的src目录下:
Xml代码
<?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>  
<?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配置文件中设置:
Xml代码
<!-- 设置Hibernate的缓存接口类,这个类在Hibernate包中 -->   
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>
   
 <!-- 是否使用查询缓存 -->   
 
<property name="hibernate.cache.use_query_cache">true</propert>    

  如果使用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的缓存接口类,这个类在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、实践出真知,给一段测试程序,如果成功的话第二次查询时不会读取数据库
Java代码
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();    
 }
}

你可能感兴趣的:(Hibernate)