1

我有一个单例,其中包含一些我想从数据库中缓存的数据。我希望它在每次访问并且经过一定时间时调用数据库并刷新其数据。我使用的单例模式是来自 Effective Java 的枚举模式。您认为实现这一目标的最佳方法是什么?理想情况下,我会覆盖每次调用 MySingleton.INSTANCE 时调用的某个方法……但我不知道这种方法是否存在。另一个想法是在客户端代码可以访问的每个方法中包含对刷新方法的调用……但这对我来说似乎很笨拙。

4

3 回答 3

3

而不是直接访问实例,您可以使用

DataCache.getInstance().method();

getInstance()可以检查数据是否需要刷新。

于 2013-09-01T21:30:46.133 回答
1

对于这种情况,一个健壮的、高性能的和经过良好测试的解决方案是像 EHCache 这样的缓存库:http: //ehcache.org/

于 2013-09-01T21:29:13.210 回答
0

看来您需要的是基于时间的驱逐缓存。
看看Google Guava Cache 库:

CacheBuilder 提供了两种定时驱逐的方法:

  • expireAfterAccess(long duration, TimeUnit unit)仅在自上次通过读取或写入访问条目后经过指定持续时间后才使条目过期。请注意,条目被驱逐的顺序将类似于基于大小的驱逐。
  • expireAfterWrite(long duration, TimeUnit unit)条目创建后经过指定的持续时间或最近的值替换后过期条目。如果缓存的数据在一段时间后变得陈旧,这可能是可取的。

那么您需要哪种方法?你说:

我希望它在每次访问并且经过一定时间时调用数据库并刷新其数据。

从什么时候开始已经过了一定的时间?

  • 自从上次从缓存中读取条目以来?自从从数据库加载条目以来已经过去了多少时间都没有关系?然后使用expireAfterAccess()
  • 自从条目上次从数据库加载到您的缓存中?然后使用expireAfterWrite()

您甚至可以同时使用它们。
这是这样的例子: http: //mkorytin.blogspot.com/2012/02/caching-objects-with-guava.html

于 2013-09-02T09:03:28.967 回答