- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我正在开发一个 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/
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
关闭。这个问题需要details or clarity .它目前不接受答案。 想改进这个问题吗? 通过 editing this post 添加细节并澄清问题. 关闭 8 年前。 Improve t
我卡在了一个点上,我无法进步,很抱歉这个愚蠢的问题。我为此进行了很多搜索,但我不知道我错过了什么。请帮助我。 我研究了 python 中的模块和类。现在我想使用 python 和 apt 进行一些操作
我在 Kong 有服务,我已经为该服务设置了代理缓存插件。 curl -X POST http://localhost:8001/plugins --data "name=proxy-cache"--
ASP.NET Core 提供内存缓存和响应缓存。 假设该应用程序是 ASP.NET Core WebAPI,它通过配置的响应缓存中间件将 SQL 数据库中的数据传送给用户。 在什么情况下也使用内存缓
我最近遇到了以下面试问题: You need to design a system to provide answers to factorials for between 1 and 100. Yo
我的 Javascript (JS) 代码遇到了一些麻烦,因为我有时需要在同一个函数中多次访问相同的 DOM 元素。还提供了一些推理here . 从性能的角度来看,是一次性创建一个 jQuery 对象
仅使用 Cache 终端,我使用或查看什么实用程序函数或 Global 来查找存在于 Cache 数据库中的所有 Globals 的列表? 再次仅在缓存终端中使用,我使用或查看什么实用程序功能或全局以
我的 Javascript (JS) 代码遇到了一些麻烦,因为有时我需要在同一个函数中多次访问同一个 DOM 元素。还提供了一些推理here . 从性能的角度来看,是先创建一个jQuery对象然后缓存
来自 RFC 2616 http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.9.1 no-cache If the no-cach
大多数 CDN 服务器对经常访问的内容使用缓存。 场景:假设有人上传了一张非常热门的图片,并且来自同一位置的许多用户 (1000) 试图访问该图片。 问题:假设网络服务器收到一个请求,首先检查它的缓存
我的 Javascript (JS) 代码遇到了一些麻烦,因为有时我需要在同一个函数中多次访问同一个 DOM 元素。还提供了一些推理here . 从性能的角度来看,是先创建一个jQuery对象然后缓存
如果我将服务器响应设置为:Cache-Control: private,no-cache,max-age=900 ? 如果标题是这样的,会发生什么:Cache-Control: public,no-c
我有一个类需要在缓存中存储数据。最初我在 ASP.NET 应用程序中使用它,所以我使用了 System.Web.Caching.Cache。 现在我需要在 Windows 服务中使用它。现在,据我了解
我遇到了和这个人一样的问题:X-Drupal-Cache for Drupal 7 website always hits MISS ,并且找不到出路。 我正在运行 Drupal 7 - 新闻流 和
我已将 Laravel 设置为使用 Redis 作为缓存。当我使用 Cache::('my_var', 'my_val'); 然后通过 CLI 检查 Redis 以查看 key 是否已创建时,我可以验
我在 Windows Azure 云上有一个应用程序,并且正在使用 Windows Azure 共置缓存。 有时,当我发布网站/web服务时,调用DataCacheFactory.GetCache方法
我正在阅读 documentation for Apollo server-side caching ,但看不到任何关于缓存通常如何加密的内容。 我需要的是一个以响应中包含的对象 ID 为键的缓存,而
Hibernate\Grails 中最好的缓存策略是什么?是否缓存所有实体和查询以及如何找到最佳解决方案? 这是我的 hibernate 配置。 hibernate { cache.use_sec
我收到错误 'Nuget.Proxy Cache' 的类型初始化器抛出异常 尝试连接到 Nuget 官方包源时。我在公司网络后面,但是我怀疑问题是连接性。 有任何想法吗? 最佳答案 我有同样的问题。我
我是一名优秀的程序员,十分优秀!