为servlet数据实现缓存

时间:2014-05-01 18:44:14

标签: java servlets caching

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

为了对它进行一下,在Servlets init方法中,我将一个全局长变量(lastUpdateTime)初始化为当前系统时间。我还有一个全局变量引用产品的arraylist(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();
}

我对代码进行了测试,但它的工作效果很好,但我的问题是,由于我对网络开发还不熟悉,任何人都可以看到我的方法存在任何缺陷。

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

感谢您的投入。

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

如果您想要退出手动缓存管理,可以部署一个缓存库,如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,您可能不想这样做。

干杯!