因为项目要与数据库实例解耦和为了将来对数据进行分库分表的需要,最近对公司项目与数据库之间加入数据库中间件,因为MyCat-2.0在beta状态,MyCat-1.6已经不怎么进行维护了。所以选择了对MyCat进行二次开发的dble。
问题
项目中有使用activiti-5.22版本,在切换至dble后发现在执行一些activiti表的操作时会出现如下异常:1
2
3### Cause: org.activiti.engine.ActivitiException: Couldn't deserialize object in variable xxxx with root cause
java.io.StreamCorruptedException: invalid stream header: EFBFBDEF
原因
https://github.com/MyCATApache/Mycat-Server/issues/1192
MyCAT(dble)在处理数据库数据类型为blob的数据时,会先将byte[]
转换为utf8的String
,再由String转为byte[]
。而byte[]
类型对应的真实数据不一定是String
,不清楚是不是activiti机制,我们的项目在blob列中实际保存的是一个对象的序列化后的数据。
序列化后的数据在经过dble转成String
再转为byte[]
存入数据库后再由byte[]
进行反序列化就会失败,因为经过String
转换后的byte[]
与源数据是不一致的。
解决办法
如MyCAT的issue中所写,开启mysql客户端的服务器预编译功能就可以解决这个问题1
activitidb.url=jdbc:mysql://127.0.0.1:8066/activiti?useServerPrepStmts=true
github上的issue显示MyCAT的成员虽然已经知道了这个问题,但是并不打算对它进行修复。
在dble的issue列表中没有发现类似的issue,不知道dble团队是没发现这个问题还是已经做过处理了,但是还存在遗漏的情况。
具体情况只能在了解dble的源码后才能知道了。