gpt4 book ai didi

java - 实现 servlet 数据的缓存

转载 作者:行者123 更新时间:2023-12-02 05:52:33 25 4
gpt4 key购买 nike

我有一个 Servlet,它与 EJB 通信以从我的数据库中提取产品列表。这个操作相当快(5秒),但是数据库中的产品列表不会经常改变,所以我开始认为也许我应该实现某种基于时间的缓存机制,这样我就不会去如果不需要的话,每次有人访问我的 Servlet 时都会访问数据库。

为了尝试一下,在 Servlet init 方法中,我将全局长变量 (lastUpdateTime) 初始化为当前系统时间。我还有一个引用产品数组列表(allProducts)的全局变量。

当我的 Servlet doGet() 方法被调用时,我使用一个名为 shouldRefreshData() 的方法,我用它的返回值来确定是否应该调用我的 ejb 来获取产品。

shouldRefreshData() 方法基本上做了两件事:

-checks to see if the array list of products is null (returns true in this case)
-checks to see if the time difference between the current time and the lastUpdateTime is greater than some time (1 minute for my testing, and if so, return true)
-otherwise, return false

然后我使用 shouldRefreshData() 的结果,如下所示:

if(shouldRefreshData()) {
allProducts = productManager.getProducts();
lastUpdateTime = System.currentTimeMillis();
}

我测试了代码,它运行得很好,但我的问题是,由于我对 Web 开发相当陌生,任何人都可以看到我的方法有任何缺点吗?

其次,是否存在基于时间的缓存模式可能比我正在采用的方法更有效?或者更好的是,有一种机制可以让我说这里是我拥有的数据,如果数据库中的数据不同,则更新。

感谢您的投入。

最佳答案

这可行,但它的缺点是您必须自己清理缓存。

如果您想摆脱手动缓存管理,可以部署像 infinispan 或 ehcache 这样的缓存库。

如果您不想花时间设置(另一个)第 3 方库,您可以随时执行以下操作:

@Singleton
public class CacheResource {
public void put(String key, Object value) { /* snip */ }
public void get(String key) { /* snip */ }
/* snip ... */

@Schedule(hour="*", minute="∗/5")
public void clearCache() { /* snip */ }
}

这将创建一个缓存资源,该资源是一个单例 bean,每 5 分钟就会自行清除一次。您仍然自己管理缓存,但它不与某个应用程序绑定(bind),您不必担心按时清除缓存。这也意味着您可能不希望将另一个 EJB 部署到您的容器中。

干杯!

关于java - 实现 servlet 数据的缓存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23414307/

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