破解远程/虚拟磁盘上的"真正"Java刷新

lor*_*nzo 5 java vmware flush nas

我正在寻找一个"技巧"或"黑客"来确定文件是否已经保存在远程磁盘上,通过vmware缓存,NAS缓存等.

刷新和关闭FileOutputStream是不够的.我认为Channel.force(true)既不是.

我正在考虑这样的事情:

  • 写入文件并读回文件
  • 写入文件,检查时间戳,重命名文件,检查不同的时间戳
  • 使用"错误内容"编写文件,用原始内容覆盖,读回并检查内容

也许有人有同样的问题,并找到了解决方案.

我的要求是不要丢失数据.java应用程序以这种方式工作:

  1. 接受来自远程源的文件
  2. 添加数字签名和经过认证的时间戳,以创建新文件.如果此文件丢失,则无法以任何方式重新创建.
  3. 将此文件写入存储
  4. 将文件标记为在数据库上签名
  5. 告诉偏远的一面,一切都好

今晚我们遇到了崩溃,并且在第5步之后但是在将数据实际刷新到远程存储之前有三次交易失败.所以数据库说一切都很好,远程端被告知相同,但15秒的签名数据丢失了.这不好.

正确的解决方案可能是对远程文件系统进行"同步安装".但这不会在短时间内发生.即使在这种情况下,鉴于应用程序在VMWare服务器上运行,我也不完全信任这种情况.

因此,我希望有一个"尽力而为"的黑客来防止(缓解)像这样的事件.

小智 2

让我们从一个假设开始:您无法保证对任何单个磁盘的任何单次写入。在写入和磁盘盘片之间有太多的软件和硬件层。即使你能保证写入,你也不能保证数据可读。磁盘有可能在写入和读取之间崩溃。

唯一解决方案是冗余,由框架(例如 RDMS)或您的应用程序提供。

当您收到并签署文件时,您需要将其发送到不同物理主机上的多个目的地,并等待它们回复已保存文件。其中之一可能会崩溃。其中两个可能会崩溃。数据的重要性将决定您需要多少远程主机。

顺便说一句,冗余也适用于您的数据库。事实上,提交的事务并不意味着您能够在数据库崩溃后恢复它(尽管 DBMS 工程师在确保写入方面比您或我拥有更多经验,但这一切都取决于了解事物的系统管理员就像“日志和数据文件必须驻留在单独的物理驱动器上)。我强烈建议您(冗余地)将足够的元数据与文件一起存储,以便能够重建数据库条目。