0

對於一個特定的需求,我必須在不同的機器上的多個tomcat實例之間共享簡單的Java緩存對象。爲了實現這一點,我嘗試了序列化緩存對象並將其保存在共享目錄中。 在執行某些操作之前,此緩存對象將被所有實例引用[反序列化/ readobject],並在正在處理的操作之後由所有實例更新/覆蓋[serialize/writeobject]。 在內部,我將在序列化/反序列化之前創建一個標記文件[empty one],並在序列化/反序列化後將其刪除。因此,如果標誌文件可用,則實例正在使用緩存對象,所以其他實例應等待處理。序列化ObjectInputStream無效的流頭:00000000

它的工作原理當負載是最小的,但當負載較高,我開始得到。我相信這可能是因爲僵局。有沒有辦法確保單個文件的同時處理不會導致此問題。我無法使用Java同步,因爲它特定於實例。非常感謝您的幫助。

java.io.StreamCorruptedException: invalid stream header: 00000000 
    at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:780) 
    at java.io.ObjectInputStream.<init>(ObjectInputStream.java:277) 

回答

1

通過文件共享數據可能會非常棘手,無法得到正確的結果。您可能會考慮使用Chronicle Map,該設計用於在進程之間共享持久數據,但不以線程安全方式創建和刪除文件。

+0

謝謝,會看看:) – 2014-09-24 06:50:29

+0

順便說一句,我想避免引入第三方工具,並嘗試一個解決方法,而不是。 – 2014-09-24 07:00:03

+0

@ popeye.sailor在這種情況下,最簡單的解決方案很可能是; a)使用鎖定文件,b)首先寫入臨時文件,並在完成時將其重命名爲原始文件。 – 2014-09-24 07:03:17

相關問題