Hibernate比JDBC程序要稍慢一点,但是如果用好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