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