2013-07-01 17:13:15.101 WARN net.spy.memcached.transcoders.SerializingTranscoder: Caught IOException decoding 848 bytes of data java.io.InvalidClassException: com.*.article.qa.entity.Qa_question; local class incompatible: stream classdesc serialVersionUID = 5590259895198052390, local class serialVersionUID = 7673969121092229700 at java.io.ObjectStreamClass.initNonProxy(ObjectStreamClass.java:562) at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1582) at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495) at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731) at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) at net.spy.memcached.transcoders.BaseSerializingTranscoder.deserialize(BaseSerializingTranscoder.java:129) at net.spy.memcached.transcoders.SerializingTranscoder.decode(SerializingTranscoder.java:88) at net.spy.memcached.transcoders.TranscodeService$1.call(TranscodeService.java:63) at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:303) at java.util.concurrent.FutureTask.run(FutureTask.java:138) at net.spy.memcached.transcoders.TranscodeService$Task.run(TranscodeService.java:110) at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) at java.lang.Thread.run(Thread.java:662)
访问一些链接,访问数据库,底层就抛出这个错误。并非都出现,而是几率性出现。
目前并没有发现不一致的地方。有可能是底层缓存net.spy.memcached里的代码影响。原因是:我本地的实体增加了三个字段,但是缓存里并没有改变影响,进一步追踪中......
根据网上说明:
异常原因
本地和远程的entity序列化后的serialVersionUID不一致导致
解决方法
将本地的序列化的类中的版本号(serialVersionUID )改成和远程中一样,在本地的序列化类里的private static final long serialVersionUID = 改成远程的就行了,如果没有的话就加上这句。
解决办法:
在dao.propertities里面添加:memcache.key.version.Qa_question=1.0.1
为什么添加这行,说明如下:
Dao配置文件 dao.properties,由系统启动加载,系统变量"-Ddao.config.file=文件的绝对路径"
#entity默认的key版本 memcache.key.version.default=1.0.0 #如果一个entity版本变更,需要在配置文件中定义一个key,无须重启,自动生效 #格式:memcache.key.version.{entity的class名字}=版本号 memcache.key.version.User=1.0.1 #memcache client factory class name #如果开启cache,打开下行注释,不启动cache,注释下行 memcache.client.factory=MemcachedClientSpyFactory # Spy Params Config spy.memcached.servers=host1:11211,host2:11311 # Set the default expire time in seconds spy.memcached.defaultExpire=86400 spy.memcached.compressionThreshold=16384 # Set the default operation timeout in milliseconds. spy.memcached.opTimeout=1000