我有中等规模的流量电子商务网站。大约有200-300位访客。 Webapp功能包括:
我正在广泛使用Ehcache来缓存大多数目录数据,因为网站上的所有流量都需要它。但是,当我在tomcat上部署新版本时,几乎总是由于触发过多的查询而使数据库服务器停止工作。 Ehcache无法在此提供帮助,因为到目前为止,没有任何内容被缓存。最好的情况是,直到网站仍然非常缓慢并且ehcache设法缓存重要数据时,它大约需要45分钟。最糟糕的情况是网站崩溃并且应用程序停止运行。
在开发环境中,它没有任何流量,因此运行非常流畅。为了快速找到解决此问题的方法,我们进行了快速修复。
解决方法是:在ServletContextListener
中,我们对与目录有关的最关键服务进行了虚拟打击,这些服务正因过多的查询而耗尽数据库服务器。由于此更改,一旦部署了应用程序,我们就会在内存中获取与目录相关的所有数据,并由ehcache对其进行高速缓存。此后,应用程序变得对公众可用。虽然,当我们部署应用程序时,此更改导致启动时间延迟了约30秒,但我们设法摆脱了45分钟的缓慢网站访问。
此修复程序确实解决了我们的问题,但感觉不是一个好的解决方案。因为与目录或其他关键数据有关的所有内容都将存储在内存中,而无论它是否习惯。大约有3.5 GB的数据。而且,现在在开发环境中工作现在是一场噩梦。由于开发系统内存不足。
请提出一个解决此问题的好方法。
答案 0 :(得分:1)
在启动时填充缓存是个好主意。那就是我会做的。如果它适合内存,我不介意加载太多东西。
另一种选择是具有过期策略,并定期ping缓存以删除过期的条目。但这听起来更像是浪费时间。
分布式缓存也可以解决该问题,但这意味着为您的体系结构增加一层复杂性。我只会在必要时这样做。而且我认为不是。
然后,要防止在dev中进行加载,只需使用Spring概要文件,该配置文件将使加载仅在生产中处于活动状态(理想情况下为登台)。