gpt4 book ai didi

Java Web 应用程序 : How to implement caching techniques?

转载 作者:IT老高 更新时间:2023-10-28 20:25:24 25 4
gpt4 key购买 nike

我正在开发一个 Java Web 应用程序,该应用程序的行为基于从 Web 服务加载的大型 XML 配置文件。由于在访问应用程序的特定部分之前实际上并不需要这些文件,因此它们是延迟加载的。当需要这些文件之一时,会向 Web 服务发送查询以检索相应的文件。由于某些配置文件的使用频率可能比其他配置文件要多得多,因此我想设置某种缓存(可能有 1 小时的过期时间)以避免一遍又一遍地请求同一个文件。

Web 服务返回的文件对于所有 session 中的所有用户都是相同的。我不使用 JSP、JSF 或任何其他花哨的框架,只使用普通的 servlet。

我的问题是,在 Java Web 应用程序中实现这种全局静态缓存的最佳实践是什么?单例类是否合适,还是会因为 J2EE 容器而出现奇怪的行为?我应该通过 JNDI 在某个地方公开一些东西吗?我应该怎么做才能使我的缓存不会在集群环境中被搞砸(可以,但不是必须的,每个集群服务器都有一个缓存)?

鉴于以上信息,将负责缓存的对象作为 ServletContext 属性放置是正确的实现吗?

注意:我不想在启动时加载所有这些并完成它,因为那样会

1)。每当我的应用程序启动时重载网络服务
2)。在我的应用程序运行时文件可能会更改,所以无论如何我都必须重新查询它们
3)。我仍然需要一个全局可访问的缓存,所以我的问题仍然存在

更新:使用缓存代理(如 squid)可能是个好主意,但对 web 服务的每个请求都会在 post Data 中发送相当大的 XML 查询,每次可能不同。只有 Web 应用程序真正知道对 Web 服务的两个不同调用实际上是等效的。

感谢您的帮助

最佳答案

这是一个使用 EhCache 进行缓存的示例。此代码在多个项目中用于实现临时缓存。

1) 将缓存放在全局上下文中。 (别忘了在WEB.XML中添加监听器)。

import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;

public class InitializationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
ServletContext ctx = sce.getServletContext();
CacheManager singletonManager = CacheManager.create();
Cache memoryOnlyCache = new Cache("dbCache", 100, false, true, 86400,86400);
singletonManager.addCache(memoryOnlyCache);
cache = singletonManager.getCache("dbCache");
ctx.setAttribute("dbCache", cache );
}
}

2) 在需要时检索缓存实例。即来自 servlet:

cache = (Cache) this.getContext().getAttribute("dbCache");

3) 在执行昂贵操作之前查询缓存。

        Element e = getCache().get(key);
if (e != null) {
result = e.getObjectValue(); // get object from cache
} else {
// Write code to create the object you need to cache, then store it in the cache.
Element resultCacheElement = new Element(key, result);
cache.put(resultCacheElement);

}

4) 也不要忘记在适当的时候使缓存对象无效。

您可以找到更多示例here

关于Java Web 应用程序 : How to implement caching techniques?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/699996/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com