阅读:5296回复:0
平台中使用sqlMap更新mysql的Blob字段问题
环境:
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()))); |
|
最新喜欢:![]() |