通过二级缓存提升Hibernate应用的性能

来源:转载


通过二级缓存提升Hibernate应用的性能



刚刚接触Hibernate的开发工程师有时不理解Hibernate的缓存,并合理地使用。如果能够很好地使用,二级缓存会成为提高应用性能的最有效的方式。

作者 John Ferguson Smart 译者 张立明([email protected]





大量的数据库通讯流量是影响Web应用性能的最常见原因。Hibernate是一个高性能、对象-关系型持久和查询服务的框架,但是,如果不做一些调整,它不能解决你的性能问题。本文剖析了Hibernate的缓存功能并告诉你如何显著提高应用程序的性能。

缓存介绍

缓存技术在优化数据库应用中被广泛地使用。缓存通过在应用程序中保存从数据库读取的数据的机制来减少数据库和应用程序之间的通讯流量。只有在读取缓存中没有的数据的时候,才有必要从数据库读取。因为应用程序的缓存无法知道缓存中的数据是否为最新的数据,所以应用程序在数据可能被更新的情况下,需要定时不断地清空缓存。

Hibernate缓存

Hibernate使用两种不同的缓存来保存对象:一级缓存和二级缓存。一级缓存是会话(Session)级的缓存,而二级缓存是会话工厂(Session Factory)级的缓存。默认情况下,Hibernate针对每个事务使用一级缓存。通过一级缓存,Hibernate减少了一个事务期间需要生成的SQL查询。例如,如果对象在一个事务期间被修改了几次,Hibernate会仅仅在事务结束之前生成一个SQL UPDATE语句,这个语句包含了这几次修改的内容。本文重点讲述二级缓存。为了减少数据库的访问压力,二级缓存保存跨多个事务的、会话工厂(Session Factory)级的载入的对象。这些对象可以被整个应用所使用,而不是仅仅执行这个查询的用户。一旦一个查询返回一个对象,如果这个对象已经在缓存中,一个或多个潜在的事务可以免去。

此外,如果你需要缓存查询的结果,而不是持久化的对象,你可以使用查询级的缓存。

缓存的实现

缓存是软件中的一个复杂领域,市面上有多个可选的方案(开源的或商业的)。Hibernate支持下面的开源缓存实现方案:

EHCache (org.hibernate.cache.EhCacheProvider)
OSCache (org.hibernate.cache.OSCacheProvider)
SwarmCache (org.hibernate.cache.SwarmCacheProvider)
JBoss TreeCache (org.hibernate.cache.TreeCacheProvider)

每一个缓存方案在性能、内存使用、可配置能力等方面都是不同的:

EHCache是一个快速的、轻量级的、易于使用的、进程内的缓存。它支持read-only和read/write缓存,内存和磁盘缓存。但是不支持集群(Clustering)。
OSCache是另外一个开源的缓存方案。它同时还支持JSP页面或任意对象的缓存。OSCache功能强大、灵活,和EHCache一样支持read-only和read/write缓存、支持内存和磁盘缓存。同时,它还提供通过JGroups或JMS进行集群的基本支持。
SwarmCache 是一个简单的、基于JavaGroups提供集群的缓存方案。支持read-only和nonstrict read/write缓存(下一节解释这个概念)。这种缓存适用于读操作远远高于写操作频率的应用。
JBoss TreeCache is a powerful replicated (synchronous or asynchronous) and transactional cache. Use this solution if you really need a true transaction-capable caching architecture. 是一个强大的、可复制(同步或异步)和支持事务的缓存。如果你需要一个真正的支持事务的缓存架构,使用这个方案吧。

另外一个值得提及的商业缓存方案是 Tangosol Coherence cache.

缓存策略

一旦你选定了你的缓存方案,你需要指定你的缓存策略。下面是四个可选的缓存策略:

Read-only: 这种策略对于从来不修改、只需要频繁读取的数据是非常有用的,也是最简单、性能最好的缓存策略。
Read/write: 如果数据需要被更新,Read/write缓存策略可能是比较合适的。这种策略比read-only消耗更多的资源。 在非JTA环境中,每个事务必须在Session.close()或Session.disconnect()调用之前结束。
Nonstrict read/write: 这种策略不保证两个事务不会同时改变同一个数据。因此,更适用于偶尔修改数据、频繁读取数据的场合。
Transactional: 这是一个完全事务支持的策略,可以在JTA环境中使用。



分享给朋友:
您可能感兴趣的文章:
随机阅读: