2013-04-02 50 views
1

我正在編寫一個webapp(SpringMVC + JSF),它允許用戶上傳他們的文件並編輯/與他人共享。在這個應用程序的服務層上,我使用番石榴來處理所有的文件IO,但不幸的是,從我在參考手冊中看到的東西中,番石榴並沒有解決併發訪問文件的問題。在webapp中同時訪問文件的最佳解決方案

我知道Java提供的FileChannel類有一個鎖定方法,它在某種程度上解決了這個問題,但它不適合於guava IO框架。在擺脫番石榴並用FileChannel和InputStream重寫我的代碼之前,我想知道是否有其他方法可以在不完全切換到另一個IO包的情況下執行此操作。

(A大的哈希表映射文件名來鎖看起來並不像一個很好的解決方案給我。當用戶基數大的有太多的內存來存儲。)

+0

你可以在'File'對象上同步而不是鎖嗎? –

+0

@ bmorris591會有很多文件,所以對象將在任何IO函數調用結束時立即銷燬。也許創建一個帶有文件名的數據庫表,設置讀者,設置作家是這樣的應用程序的最終解決方案,但我只會這樣做,如果真的沒有其他簡單的解決方案。 – aaronqli

+0

@ bmorris591除此之外,當別人閱讀時阻止讀者不是一個好主意。將文件對象標記爲「同步」會導致此不良行爲。 – aaronqli

回答

3

使用的數據庫。文件系統非常適合於存儲實際的文件內容 - 但是對於存儲管理用戶,文件詳細信息,共享和編輯版本歷史記錄等,絕對需要數據庫。

爲避免上傳失敗造成的信息丟失,上傳編輯(例如)需要轉到新文件 - 不覆蓋現有文件,並且可能會將其刪除。

編輯&共享也可以假定爲可能具有連續版本(磁盤上的實際文件)的實體(可能是'DOCUMENT'表中的行)。

因此,至少有兩個原因,「文件系統文件」是從實體不同,你需要跟蹤&用戶希望的工作。

如果你假設的用戶羣確實有變大,他們可能會期望一個真正的應用程序。擁有可靠的數據庫,錄製用戶訪問權限,文件版本,共享&的位置&鎖定磁盤上底層文件的狀態,很容易&可靠。

沒有這樣的數據庫,不可能做到可靠。

+2

但是_do_使用文件系統來存儲實際的文件內容--FS對於這種目的更有效率。不要使用BLOB。 –

+0

謝謝。這是真的。如果存在一些專門的數據庫來存儲文件內容並隱式處理同步問題,或者該領域的開源庫,那將會很不錯。這絕對是一種需求。 – aaronqli

+1

同步不是太糟糕 - 只需要一個DOCUMENT.STORED_FILE列或一個DOC_VERSION.STORED_FILE列。一旦上傳/新版本成功,只需使用新文件數據的(內部路徑)更新或存儲記錄。數據庫查詢將只能看到結果完整和有效的文件..什麼可能更簡單? –