CSDN博客

img ah_cai

使用JCS在Web门户应用中实现对象缓存(1)

发表于2004/4/22 14:50:00  1274人阅读

使用JCSWeb门户应用中实现对象缓存

在我最近的web门户应用开发工作中,我们需要在Servlet容器(Tomcat)的内存中存储一些查找数据(例如:比率更新数据、状态和产品列表),这样我们不需要在每次访问数据的时候进行数据库查找。同时,我们也需要定期地刷新存储在内存中的数据以保证其新鲜和准确。我们也需要一种机制在不同的时间间隔对存储在内存中的不同类型的数据进行刷新。例如,比率更新数据需要每天刷新一次,而查找类型的数据则可以在内存中保留很长一段时间。对象缓存是最方便地达到上述所有目的的完美解决方案。

对象缓存

最恰当的对象缓存的定义可以在Object Caching Service for Java (OCS4J)的功能规范文档中找到 ,它是这样定义的:

服务器必须将信息和可执行对象分为三种基本类别管理: 永远不会改变的对象,每次请求都会发生改变的对象,以及在两者之间的对象。Java 对前两种对象的处理提供了很好的支持,但是对第三种类别的支持非常有限。如果对象永远不改变,我们在服务器初始化的时候创建静态对象。如果对每个请求对象都是不同的,我们每次都创建新的对象。对于介于两者之间的对象或信息,它们的状态可能会发生变化,但是又需要提供跨越请求、跨越用户或跨越进程的共享,就要采用“对象缓存服务”了。

基本上,对象缓存就是通过在使用对象后不立即释放,而是存储在内存中并被后来的客户端请求重用,避免重新获得对象的昂贵成本。当数据第一次从数据源被检索出来后,在名为cache的内存缓冲中临时存放。 同样的数据再次被访问的时候,对象从缓存中取出来,而不是从数据源重新获取。最后,被缓存的数据在不再需要的时候从内存中释放出来。从Web应用的观点来看,什么时候指定的对象可以从内存中释放出来取决于定义一个对象变成无效的合理的间隔时间。

缓存的益处

对象缓存最主要的益处就是对应用性能的重大提升。在一个多层应用中,与其他工作比较,数据访问是一种代价非常高的操作。通过将频繁被访问的数据By keeping the frequently accessed data around 并在第一次使用后不释放,我们可以避免重新获取与释放对象的开销和时间。这将会大规模提升web应用的性能,因为我们不用在每次获取数据的时候访问数据库了。

可伸缩性是使用对象缓存带来的另一个好处。因为被缓存的数据可以跨越多个sessionweb应用 访问,对象缓存可以成为可伸缩性Web应用设计的一个重要部分。采用对象缓存,就像对象池一样,可以帮助避免获取与释放对象的开销。

缓存的不利因素

web应用中使用对象缓存可以带来很多益处,但是缓存对象同时也会带来一些不利的因素。

  • 同步复杂性: 复杂性的增长依赖于数据的种类,因为需要保证被缓存数据与数据源中原始数据的一致性。要不然,被缓存的数据就会与实际数据不一致,将会导致应用中的数据错误。
  • Durability: 当服务器崩溃的时候,被缓存数据的修改回丢失。可以采用同步缓存避免该问题。
  • 内存大小: 如果有大量没有用处的数据存放在缓存中,并且这些数据没有在正常的时间间隔内被释放,JVM 内存大小就会变得无法接受的庞大。

缓存实例

不经常变化的、需要花费很长时间从数据源获取的数据都是缓存的最佳选择。这包括了几乎所有的静态数据、代码和描述列表,以及带有分页功能的查找结果 (搜索结果可以从数据源一次获取出来并存放在缓存中,等待用户在结果页面上点击页数链接时显示)

中间件技术如EJBCORBA允许在客户端与服务器之间的远程对象传输。像这种类型的访问,也被称为 粗粒度数据访问, 用于降低昂贵的远程方法调用开销。如果这些数据传输对象 (也被称为值对象) 变化不是非常频繁,它们可以被存储在缓存中。这样可以在每次客户端需要值对象时减少servlet容器访问应用服务器的次数。

那么哪些类型的数据不宜被缓存呢?这里是一些不推荐使用缓存的数据类别:

  • 可以被网站上其他用户访问的安全信息。
  • 用户描述信息。
  • 私人信息,包括社会保险号码或信用卡明细信息。
  • 经常变化的,并且不准确或不及时会引发问题的业务信息。
不应该被其它用户访问的特定于Session的数据。
0 0

相关博文

我的热门文章

img
取 消
img