当前位置: 首页 > 面试题库 >

如何在不同的应用程序级别上锁定文件?

嵇财
2023-03-14
问题内容

这是场景:我有一个在servlet容器中运行的多线程Java
Web应用程序。该应用程序在servlet容器内多次部署。在不同的服务器上运行着多个servlet容器。

也许这张图很清楚:

server1
+- servlet container
   +- application1
   |  +- thread1
   |  +- thread2
   +- application2
      +- thread1
      +- thread2
server2
+- servlet container
   +- application1
   |  +- thread1
   |  +- thread2
   +- application2
      +- thread1
      +- thread2

网络共享目录中有一个文件,所有这些线程都可以访问。而且他们确实经常访问该文件。在大多数情况下,文件仅由那些线程读取。但有时它是书面的。

我需要一个故障保护解决方案来同步所有这些线程,以便保证数据的一致性

无效的解决方案(正确)

  1. 使用java.nio.channels.FileLock
    我可以使用FileLock类同步来自不同服务器的线程。但是,这对于同一进程(servlet容器)中的线程不起作用,因为文件锁在整个进程范围内都可用。

  2. 使用单独的文件进行同步,
    我可以创建一个单独的文件,该文件指示进程正在读取文件或正在写入文件。此解决方案适用于所有线程,但有一些缺点:

    • 性能。创建,删除和检查文件是很慢的操作。具有一个同步文件的低权重实现将阻止并行读取文件。
    • JVM崩溃后,同步文件将保留,从而需要进行手动清理。
    • 我们已经在删除网络文件系统上的文件时遇到了奇怪的问题。
    • 使用消息传递
      我们可以实现一个消息传递系统,线程将使用该消息传递系统来协调文件访问。但这似乎太复杂了。再说一次:性能会很差。

有什么想法吗?


问题答案:

如果只需要很少写入文件,那么如何以临时名称写入文件,然后使用重命名使其对读者“可见”呢?

但是,这只能与Unix文件系统可靠地一起工作。在Windows上,您需要处理某些进程打开文件(以供读取)的情况。在这种情况下,重命名将失败。请重试,直到重命名成功为止。

我建议进行彻底测试,因为这可能会导致拥塞:读取请求太多,因此writer任务长时间不能替换文件。

如果是这种情况,请让读者检查临时文件,并等待几分钟,等待下一次读取,直到文件消失。



 类似资料:
  • 我在mysql查询中遇到了一个问题,我正在使用SELECT…进行更新,以锁定表数据源中的一行,这样两个实例应用程序无法同时获得相同的行。但是当我用jmeter测试我的程序时,有时mysql会返回相同的值。 我有一个id | name | last_seq表,所以当我的第一个实例应用程序选择该行时,last_seq将增加100。因此,该行的值现在是1 | opr_sequece | 100,当我的第

  • 我是Grails和Goovy的新手。我在这里查看了Grails框架文档以及关于乐观与悲观锁定的讨论 从文档中可以清楚地看出: > Grails默认使用乐观锁定。 可以关闭乐观锁定(通过使用version=false) 如果您关闭了乐观锁定,并担心并发更新时丢失数据,则必须启用悲观锁定(通过使用lock()方法) 我的问题: > < li> 似乎有3种模式。两个显式命名:乐观和悲观,另一个是隐式的—

  • 我正在使用Django REST框架,我希望有单独的文件来记录数据。 我想有一个简单的交易文件,例如。GET,PUT,POST等和一个文件的错误,我将收集在错误的情况下。 我一直在阅读Django日志文档,并提出了一些关于如何记录信息数据的配置。以下配置示例: 设置。派克 它作为文件中的预期数据样本工作: 我尝试在设置中应用另一个处理程序。py文件,例如: 我没有像预期的那样工作,现在我得到了同一

  • 问题内容: 我的logback.xml中有这个添加器 因此,目前我将所有日志保存到一个文件中。如何使它像一个文件仅保存错误日志,而另一个文件保存所有其他日志? 我想在代码中仅使用1个logger实例,如下所示: 问题答案: 开始寻找logback类别,找到过滤器。 只需将过滤器说明添加到您的附加程序即可:

  • 问题内容: 仅在使用导航时如何防止屏幕锁定? 位智可以选择执行此操作,如何在我的App中执行此操作? 问题答案: 用这个: 目标C: 斯威夫特(旧版): Swift 3及更高版本: 确保导入。 这是来自apple.developer.com的文档的链接。

  • 假设我们有一个类,其中有一个实例方法和静态方法。我们用类级锁同步了静态方法中的块