Java 实现servlet数据的缓存

Java 实现servlet数据的缓存,java,servlets,caching,Java,Servlets,Caching,我有一个Servlet,它与EJB通信,从数据库中提取产品列表。这个操作相当快(5秒),但是数据库中的产品列表不会经常更改,所以我开始考虑,也许我应该实现某种基于时间的缓存机制,这样我就不会在不需要的情况下每次有人点击我的Servlet时都去数据库 为了尝试一下,在Servlets init方法中,我将一个全局长变量(lastUpdateTime)初始化为当前系统时间。我还有一个全局变量,它引用产品的arraylist(allProducts) 调用Servlets doGet()方法时,我使用

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

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

调用Servlets 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开发还比较陌生,有人能看到我的方法有什么缺点吗

第二,是否存在比我所采用的方法更有效的基于时间的缓存模式?或者更好的是,一种机制允许我说这里是我拥有的数据,如果数据库中的数据不同,那么就更新


谢谢您的意见。

我建议您使用合适的二级缓存解决方案,如
EHCache
,而不是自己编写。这样,您也可以在其他部件上实现缓存。

这将起作用,但缺点是您必须自己清除缓存

如果您想摆脱手动缓存管理,可以部署infinispan或ehcache之类的缓存库

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

@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分钟清除一次。您仍在自己管理缓存,但它并不绑定到一个应用程序,您也不必担心是否会按时清除缓存。它还意味着另一个EJB部署到您的容器中,您可能不想这样做


干杯

谢谢,我会调查的。这只是我花了2分钟把一些东西组合起来,我觉得有一个更好的解决方案。