2015-09-05 42 views
0

我有3個在Linux上運行並執行數據庫查詢(MariaDB)和一些文件IO(硬盤和USB)的java進程。有時發生的情況是,來自一個進程的寫入操作不會反映在其他java進程上。在多個進程之間的Linux操作系統上緩存問題

兩種方案:

  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的OpenJDK 的Linux版:Fedora/CentOS的

回答

0

在幾乎所有的數據庫中,只有一個進程可以安全地訪問這些文件。數據庫通常會鎖定這些文件以防止被多個進程訪問。這可能是在某些情況下會發生這種情況,但除非數據庫被設計爲執行此操作,否則我不會使用此功能。

順便說一句:我們有一個數據庫,旨在做到這一點,所以我們知道這不是微不足道的,很少做到。

2
  1. 您是否提交了交易?您的JDBC連接是否爲自動提交?

  2. 您在發送路徑之前關閉了文件嗎?如果你沒有關閉文件,它仍然可以寫入,操作系統和Java將緩衝寫入。如果你想連續編寫一個文件,並確保其他進程看到你的變化,這裏有特殊的API結構,請參閱FileChannel.force()或RandomAccessFile的同步模式。

+0

一個事務,它是一個直接的INSERT查詢。我沒有在連接上設置任何自動提交屬性,自動提交的默認值是多少,更重要的是,如果設置爲TRUE,性能是否會受到影響?我仍然可以對事務進行一些查詢。 2.是的,我正在關閉流之前發送到其他進程。我會毫不猶豫地嘗試FileChannel.force()或RandomAccessFile的同步模式,然後我需要首先對這些進行讀取,以確保性能問題與IO上發生的USB一樣。 謝謝,你的回答有很大幫助。 –

相關問題