我有一个singleton,它包含一些我想从数据库缓存的数据。我希望它在每次访问数据库并且经过一定时间后都能调用数据库并刷新其数据。我使用的singleton模式是Effective Java中的enum模式。你认为实现这一目标的最佳方式是什么?理想情况下,我会覆盖每次调用MySingleton.INSTANCE时调用的一些方法。。。但我不知道是否存在这样的方法。另一个想法是在客户端代码可以访问的每个方法中包含对刷新方法的调用。。。但这对我来说似乎很笨拙。
您可以使用而不是直接访问INSTANCE
DataCache.getInstance().method();
getInstance()
可以检查数据是否需要刷新。
对于这样的场景,一个健壮、高性能且测试良好的解决方案是像EHCache这样的缓存库:http://ehcache.org/
您需要的似乎是一个基于时间的驱逐缓存
看看谷歌番石榴缓存库:
CacheBuilder提供了两种定时驱逐方法:
- expireAfterAccess(长持续时间,时间单位)自上次读取或写入访问条目以来,只有在指定的持续时间过后,条目才会过期。请注意,逐出条目的顺序与基于大小的逐出类似
- expireAfterWrite(长持续时间,TimeUnit单位)在创建条目或最近一次替换值后超过指定的持续时间后,使条目过期。如果缓存的数据在一段时间后变得陈旧,这可能是可取的
那么你需要哪种方法呢?你说:
我希望它每次访问数据库时都调用数据库并刷新其数据,并且经过一定时间后
从什么时候开始已经过了一段时间了?
- 自从上次从缓存中读取条目以来?从数据库加载条目到现在已经过去了多少时间都无关紧要?然后使用expireAfterAccess()
- 自从上次将条目从数据库加载到缓存中以来?然后使用expireAfterWrite()
你甚至可以同时使用它们
下面是这样的例子:http://mkorytin.blogspot.com/2012/02/caching-objects-with-guava.html