场景如下:我有一个在 servlet 容器内运行的多线程 Java Web 应用程序。 该应用程序在 servlet 容器内多次部署。有多个servlet容器 在不同的服务器上运行。
也许这张图说明了这一点:
server1
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
server2
+- servlet container
+- application1
| +- thread1
| +- thread2
+- application2
+- thread1
+- thread2
网络共享目录中有一个所有线程都可以访问的文件。他们确实经常访问该文件。 大多数情况下,文件仅由这些线程读取。但有时它是写的。
我需要一个故障安全解决方案来同步所有这些线程,以保证数据的一致性。
无法(正常)工作的解决方案:
使用 java.nio.channels.FileLock
我能够使用 FileLock 类同步来自不同服务器的线程。但这不适用于线程 在同一个进程(servlet 容器)中,因为文件锁在进程范围内可用。使用单独的文件进行同步
我可以创建一个单独的文件,指示进程正在读取或写入文件。这个解决方案 适用于所有线程,但有几个缺点:- 表现。创建、删除和检查文件是相当缓慢的操作。一个同步文件的低权重实现将阻止并行读取文件。
- 同步文件将在 JVM 崩溃后保留,因此需要手动清理。
- 我们在删除网络文件系统上的文件时遇到了奇怪的问题。
使用消息传递
我们可以实现一个消息系统,线程将使用该系统来协调文件访问。但这对于这个问题来说似乎太复杂了。再说一次:性能会很差。
有什么想法吗?
最佳答案
除了明显的解决方案之外,您已经列举了可能的解决方案:删除对该文件的依赖
除了从文件中读取数据之外,还有其他方法可以让线程获取该数据吗?如何设置某种进程来负责协调对该信息的访问,而不是让所有线程都读取文件。
关于java - 如何在不同的应用程序级别锁定文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/484182/