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