linux操作系统的多进程间缓存问题



我有3个java进程,在Linux上运行,做数据库查询(MariaDB)和一些文件IO(硬盘和USB)。有时发生的情况是,来自一个进程的写操作不会反映在其他java进程上。

两个场景:

  1. 进程a完成INSERT查询后,进程a立即启动另一个java进程(进程B),进程B没有在数据库中找到插入的值。
  2. 进程A从挂载的USB上的路径X处的某个服务器下载一个文件。下载完成后,进程A通过RMI将路径X发送给进程B。当进程B试图读取位于X的文件时,它找到了0字节的文件。它只发生在路径X在USB上,从未在硬盘上看到过这个问题。如果我在将路径X发送到进程B之前尝试读取进程A中的文件属性,一切都很好。

我怀疑在访问刚刚写入的数据的多个进程之间存在缓存问题。

更多信息:JAVA: 1.8 openJDKLinux: Fedora/CentOS

  1. 您是否提交了事务?您的JDBC连接是自动提交的吗?

  2. 发送路径之前是否关闭了文件?如果您不关闭该文件,它仍然可以写入,操作系统和Java将缓冲写入。如果你想持续写入一个文件,并确保其他进程看到你的更改,有特殊的API结构,见filecchannel .force()或RandomAccessFile的同步模式。

在几乎所有数据库中,只有一个进程可以安全地访问文件。数据库通常会锁定文件,以防止多个进程访问。在某些情况下,这可能会起作用,但除非数据库被设计成这样,否则我不会使用此功能。

顺便说一句:我们有一个数据库,它被设计来做这件事,所以我们知道这不是微不足道的,很少有人这样做。

最新更新