这是我之前的问题的后续。
假设我有一个服务器应用程序,它使用一些只读文件。有时(例如几个小时一次)我们更新这个文件并且应用程序开始使用更新的数据。
如何实施?我相信应用程序应该定期检查更新并在有可用更新时更新文件。文件更新后,应用程序应执行所有必要的初始化(例如,使内部缓存无效等),同时仍使用“旧”数据。初始化完成后,它会丢弃“旧”数据并仅使用“新”数据。
是否有意义?这个问题看起来很笼统。是否有任何现成的 Java 基础设施可以解决这个问题?
这是我之前的问题的后续。
假设我有一个服务器应用程序,它使用一些只读文件。有时(例如几个小时一次)我们更新这个文件并且应用程序开始使用更新的数据。
如何实施?我相信应用程序应该定期检查更新并在有可用更新时更新文件。文件更新后,应用程序应执行所有必要的初始化(例如,使内部缓存无效等),同时仍使用“旧”数据。初始化完成后,它会丢弃“旧”数据并仅使用“新”数据。
是否有意义?这个问题看起来很笼统。是否有任何现成的 Java 基础设施可以解决这个问题?
听起来像缓存。两个灵活的线程安全缓存实现是Guava 的缓存、EhCache或Hazelcast。这三个都将以线程安全的方式过期并重新加载。Hazelcast 和 EhCache 可以分布在网络上。Guava 不是分布式的,但更简单。
如果您决定不想使用缓存,那么对于一些长期保存在内存中的对象(例如单例),另一个常见用例是双重检查锁定。Guava 的Suppliers memoize 功能使其更加优雅。
我建议您使用带有缓存的不可变对象或 @MarkoTopolnik 建议的volatile
.
您应该有一个对象,该对象代表从文件中读取的所有数据和派生自它的服务。维护volatile
对该对象的引用,这将确保线程安全的发布。