我有一个与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();
}
我对代码进行了测试,但它的工作效果很好,但我的问题是,由于我对网络开发还不熟悉,任何人都可以看到我的方法存在任何缺陷。
其次,是否存在基于时间的缓存模式,这种模式可能比我采用的方法更有效?或者更好的是,允许我在这里说的机制是我拥有的数据,如果数据库中的数据不同,则更新。
感谢您的投入。
答案 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,您可能不想这样做。
干杯!