当前位置: 首页 > 面试题库 >

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

危飞文
2023-03-14
问题内容

我正在开发一个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请求发送到代理,以确保缓存是最新的。



 类似资料:
  • 主要内容:什么是应用程序缓存(Application Cache)?,浏览器支持,HTML5 Cache Manifest 实例,实例,Cache Manifest 基础,Manifest 文件,更新缓存,实例 - 完整的 Manifest 文件,关于应用程序缓存的说明使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。 注意:manifest 的技术已被 web 标准废弃,不再推荐使用此功能。 什么是应用程序缓存(Application Ca

  • 使用 HTML5,通过创建 cache manifest 文件,可以轻松地创建 web 应用的离线版本。 什么是应用程序缓存(Application Cache)? HTML5 引入了应用程序缓存,这意味着 web 应用可进行缓存,并可在没有因特网连接时进行访问。 应用程序缓存为应用带来三个优势: 离线浏览 - 用户可在应用离线时使用它们 速度 - 已缓存资源加载得更快 减少服务器负载 - 浏览器

  • 本文向大家介绍springboot的缓存技术的实现,包括了springboot的缓存技术的实现的使用技巧和注意事项,需要的朋友参考一下 引子 我门知道一个程序的瓶颈在于数据库,我门也知道内存的速度是大大快于硬盘的速度的。当我门需要重复的获取相同的数据的时候,我门一次又一次的请求数据库或者远程服务,导致大量的时间耗费在数据库查询或者远程方法的调用上,导致程序性能的恶化,这更是数据缓存要解决的问题。

  • Guava通过一个接口LoadingCache 提供了一个非常强大的基于内存的缓存机制。 值自动加载到缓存中,它提供了许多对缓存需求有用的实用方法。 接口声明 (Interface Declaration) 以下是com.google.common.cache.LoadingCache《K,V》界面的声明 - @Beta @GwtCompatible public interface Loadin

  • 本文向大家介绍双缓冲技术实现Android 画板应用,包括了双缓冲技术实现Android 画板应用的使用技巧和注意事项,需要的朋友参考一下 什么是双缓冲技术?双缓冲技术就是当用户操作界面完成后,会有一个缓冲区保存用户操作的结果。 为什么要使用双缓冲技术?拿Android 游戏开发来说,界面贞每次都是全部重画的,也就说画了新的,旧的就没了,所以需要使用双缓冲技术保存之前的内容。 如何实现双缓冲?使用

  • 我正在开发一个Web应用程序,其中后端在Spring引导中开发,消耗公共API中返回JSON中数据的数据。搜索是通过术语、全文(像谷歌)完成的,后端从应用程序前端接收用户的查询,用户的查询反过来搜索公共应用编程接口,等待响应,处理信息并将其发送到前端。我想在后端Spring Boot中实现缓存系统。基本上,在Spring引导调用API发布并等待响应之前,它会检查键/值系统是否已经在过去完成了搜索,