Java Web应用程序:如何实现缓存技术?

我正在开发一个Java

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

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

我的问题是,在Java

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

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

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

1)。每当我的应用程序启动时,Web服务就会过载

2)。我的应用程序运行时文件可能会更改,因此无论如何我都必须重新查询它们

3)。我仍然需要全局可访问的缓存,所以我的问题仍然成立

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

谢谢你的帮助

回答:

您的问题一起包含几个单独的问题。让我们慢慢开始。ServletContext是可以将句柄存储到缓存的好地方。但是您需要通过每个服务器实例具有缓存来付费。应该没问题

如果要在更大范围内注册缓存,请考虑将其注册到JNDI。

缓存问题。基本上,您是通过webservice检索xml。如果您通过HTTP访问此Web服务,则可以在您的一侧安装简单的HTTP代理服务器,以处理xml的缓存。下一步将是在某种本地对象缓存中缓存已解析的xml。每个服务器可以存在此缓存,没有任何问题。在第二种情况下,EHCache将做得很好。在这种情况下,处理链将是这样的Client

- http request -> servlet -> look into local cache - if not cached -> look

into http proxy (xml files) -> do proxy job (http to webservice)

优点:

  • 每个服务器实例的本地缓存,其中仅包含请求的xml中的对象
  • 一个与我们的Web应用程序在相同硬件上运行的http代理。
  • 扩展webapp的可能性,而无需为xml文件添加新的http代理。

缺点:

  • 更高级别的基础架构
  • +1故障点(http代理)
  • 更复杂的部署

更新:不要忘记总是将HTTP HEAD请求发送到代理,以确保缓存是最新的。

以上是 Java Web应用程序:如何实现缓存技术? 的全部内容, 来源链接: utcz.com/qa/404500.html

回到顶部