这是场景:我有一个在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容器)中的线程不起作用,因为文件锁在整个进程范围内都可用。
使用单独的文件进行同步,
我可以创建一个单独的文件,该文件指示进程正在读取文件或正在写入文件。此解决方案适用于所有线程,但有一些缺点:
有什么想法吗?
如果只需要很少写入文件,那么如何以临时名称写入文件,然后使用重命名使其对读者“可见”呢?
但是,这只能与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的文档的链接。
假设我们有一个类,其中有一个实例方法和静态方法。我们用类级锁同步了静态方法中的块