如何为Java/J2EE Web应用程序维护缓存?

4

我正在开发一个应用程序,每次需要连接到服务。我希望将每次搜索保存在缓存中以供后续使用。有没有这样的选项呢?

我听说过Memcached。但是我没有找到任何正确的参考网站。我们可以像在Hibernate中使用Ehcache一样使用它吗?


搜索请求(_query_)还是搜索结果(_result_)? - Thorbjørn Ravn Andersen
2
我想知道“JavaScript”与这个问题有什么关系。 - Arjan Tijms
3个回答

4

4
在Java中有各种缓存解决方案,其中包括Infinispan、EhCache和OSCache。
它们都可以作为独立的解决方案使用,例如,它们并不是专门为了作为Hibernate缓存提供程序而构建的。
缓存之间的功能略有不同。例如,Infinispan提供了对事务的一流支持(这意味着如果插入项的事务回滚,则该项将不会插入到缓存中)。EhCache对于非常大的进程内但离线存储缓存具有良好的支持。
OSCache带有非常方便的标签,可以在JSP页面上缓存内容(但无法与JSF等其他技术一起使用)。
它们中的大多数都能够执行典型的溢出到磁盘操作,并具有一些机制来使过时的条目失效。例如,Infinispan具有驱逐策略,这些策略确实从缓存中删除过时的条目(节省内存)。OSCache则从不真正从缓存中删除条目,而是将其标记为过时。当访问该条目时,调用者会被提示刷新该条目(以前是异常,但现在可能不同)。
这些东西通常是将“缓存”与简单的并发哈希映射区分开来的因素。如果您的要求比较简单,请不要忽视这个简单的解决方案。缓存可能有点难以配置,而应用程序范围内的并发映射也可能足够使用。

1
您可以使用OSCache的JSP标签轻松地按用户(即会话)缓存数据。例如,想象一个Web应用程序,其中特定用户的“工作列表”没有更改,则始终提供已缓存(即已生成)的JSP,直到列表发生更改(通过应用程序中的其他位置刷新缓存调用)。
在JSP层上包装代码,使用缓存标记如下:
<cache:cache key="foobar" scope="session">
  <%= myBean.getData() %>
</cache:cache>

这意味着在会话期间 java 代码 myBean.getData() 只会被调用一次(除非另有刷新)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接