邓羽平
骑士
骑士
  • UID280
  • 粉丝1
  • 关注2
  • 发帖数5
阅读:5296回复:0

平台中使用sqlMap更新mysql的Blob字段问题

楼主#
更多 发布于:2020-06-03 01:30
环境:
Hearken:

版本: 4.1.100
编译ID: H20151015


Mysql:
MySQL-5.6.36-1.el6.x86_64.rpm-bundle


sqlMap:
update
    bigplus_process    
set
    model=:model,
    composite=:composite,
    processname=:processname
where
    processid=:processid

java代码:

params.put("model", models.getModel());
Query query = session.createDySQLQuery(sqlMap, params);
IQueryParameter qp = new QueryParameterImpl();
qp.initParameter(query, params);

其中models.getModel()返回的是一个可序列化的对象。

在执行时发现在值不变的情况下,更新后数据库中blob字段大小变小,然后后续使用session.get(SSS.class,id)方式获取数据对象时报反序列化异常:



java.io.StreamCorruptedException: invalid stream header: EFBFBDEF



经排查,发现是平台中采用sqlMap执行update时,系统会自动把blob字段的值做一个toString操作,导致更新后数据库中blob字段存储的值被改变造成无法反序列化。

解决方案:
采用PrepareStatement手动设置blob

PreparedStatement ps = conn.prepareStatement(sql);
ps.setBlob(1, session.getSession().getLobHelper().createBlob(ByteHelper.getBytes(models.getModel())));

最新喜欢:

何万里何万里
游客

返回顶部