多个进程之间的Linux OS缓存问题

时间:2015-09-05 04:59:04

标签: java linux caching

我有3个在Linux上运行的java进程,可以进行数据库查询(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中的文件属性,那么一切都很好。
  3. 我怀疑在刚刚写入的数据访问数据的多个进程之间存在一些缓存问题。

    更多信息: JAVA:1.8 openJDK Linux:Fedora / CentOS

2 个答案:

答案 0 :(得分:2)

  1. 您是否已提交交易?你的JDBC连接是自动提交吗?

  2. 您在发送路径之前是否关闭了文件?如果你不关闭文件,它仍然可以写入,OS和Java将缓冲写入。如果要连续编写文件并确保其他进程看到您的更改,可以使用特殊的API构造,请参阅FileChannel.force()或RandomAccessFile的同步模式。

答案 1 :(得分:0)

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

顺便说一句:我们有一个专门用来做这个的数据库,所以我们知道这很简单,很少做。