配置Hibernate4二级缓存提升查询性能

HibernateJDBC程序要稍慢一点,但是如果用好Hibernate,性能还是可以接近JDBC的,在Hibernate中,可以使用二级缓存来提升Hibernate的查询性能,二级缓存采用ehcache框架开发,ehcache框架是开源社区很火的一个缓存框架,亚马逊将ehcache开发成了分布式的缓存架构,在hibernate中依然采用的是本机模式缓存,使用缓存可以提高Hibernate的性能,当数据在缓存中存在时,则从缓存中提取数据,如果不存在,则从数据库中查询数据。缓存不适合在变化频繁的场合使用,否则可能会影响查询效率。配置Hibernate缓存的步骤如下:

第一步:如果是单独的Hibernate.cfg.xml文件,则增加如下配置:

 

  <property name="current_session_context_class">thread</property>
  <property name="cache.use_query_cache">true</property>
  <property name="cache.use_second_level_cache">true</property>
  <property name="cache.use_structured_entries">true</property>
  <property name="cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</property>
  <property name="net.sf.ehcache.configurationResourceName">/hibernate-config/ehcache.xml</property>


 

如果是使用Spring管理Hibernate,则在ApplicationContext.xml文件中,增加如下配置:

<prop key="hibernate.current_session_context_class">thread</prop>
  <prop key =" hibernate.cache.use_query_cache">true</prop>
  <prop key =" hibernate.cache.use_second_level_cache">true</prop>
  <prop key =" hibernate.cache.use_structured_entries">true</prop>
  <prop key=" hibernate.cache.region.factory_class">org.hibernate.cache.EhCacheRegionFactory</prope>
  <prop key=" hibernate.net.sf.ehcache.configurationResourceName">/hibernate-config/ehcache.xml</prop>


 

第二步:配置ehcache缓存配置文件

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../../main/config/ehcache.xsd" name="tc" updateCheck="false">
    <defaultCache
        maxElementsInMemory="30000" eternal="true" overflowToDisk="false">
    </defaultCache>
</ehcache>


 

第三步:在Hibernate查询中设置缓存查询

List blogs = sess.createQuery("from Blog blog where blog.blogger = :blogger")
        .setEntity("blogger", blogger)
        .setMaxResults(15)
        .setCacheable(true)
      .list()

           或者在POJO中加上JPA注解

@Entity 
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)


 

一对多的查询缓存

@OneToMany(cascade=CascadeType.ALL, fetch=FetchType.EAGER)
@JoinColumn(name="CUST_ID")
@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public SortedSet<Ticket> getTickets() {
    return tickets;
}


第四步:验证Hibernate是否从缓存中获取数据,在Log4j中加上以下代码可以看到Hibernate从缓存中查询数据,注意,以下配置需要使用slf4j的JAR包

log4j.logger.org.hibernate=debug



 

你可能感兴趣的:(Hibernate,cache,缓存)