如何更新主要读取持久数据?

时间:2013-03-09 11:30:19

标签: java networking architecture distributed-computing

这是我previous question的后续跟进。

假设我有一个服务器应用程序,它使用一些只读文件。有时(例如几个小时)我们更新此文件,应用程序开始使用更新的数据。

如何实施?我相信应用程序应定期检查更新并在更新可用时更新文件。一旦文件被更新,应用程序应该执行所有必要的初始化(例如,使内部缓存无效等),同时仍然使用" old"数据。初始化完成后,它会丢弃旧的"数据仅适用于" new"之一。

有意义吗?这个问题看起来很通用。是否有任何现成的Java基础设施可以解决这个问题?

2 个答案:

答案 0 :(得分:3)

听起来像缓存。两个灵活的线程安全缓存实现是Guava's cacheEhCacheHazelcast。这三个都将以线程安全的方式到期并重新加载。 Hazelcast和EhCache可以通过网络分发。番石榴不是分布式的,但更简单。

如果你决定不想使用缓存,那么长期存在于内存对象(如单例)中的其他常见用例是double checked locking。 Guava使用Suppliers memoize function更优雅。

我建议您使用带有缓存的不可变对象或volatile的@MarkoTopolnik建议。

答案 1 :(得分:1)

您应该有一个对象来表示从文件中读取的所有数据和从中派生的服务。保持对该对象的volatile引用,这将确保线程安全发布。