iBatis操作CLOB类型字段时报setString can only process strings of less than 32766 chararacters

最近生产环境上因数据库某一字段类型由VARCHAR2(4000)改为CLOB后,报如下异常:

从异常信息观察,应该是com.ibatis.sqlmap.engine.type.StringTypeHandler.setParameterv即iBatis报出来的,通过代码跟踪,进入com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.class类中的update方法如下:

继续跟踪到com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.class类中,请看executeUpdate方法如下:

注意ParameterMap parameterMap = sql.getParameterMap(request, parameterObject);这句 ,继续跟踪,在com.ibatis.sqlmap.engine.mapping.sql.dynamic.DynamicSql.class中有如下方法,注意dynSql = new SimpleDynamicSql(this.delegate, dynSql).getSql(request, parameterObject);这句

继续跟踪到箭头所示 getSql(request, parameterObject)就去里,找着如下代码:

iBatis操作CLOB类型字段时报setString can only process strings of less than 32766 chararacters_第1张图片

这里应该是获取对应的类型转换器,继续跟踪到com.ibatis.sqlmap.engine.type.TypeHandlerFactory.class类中,发现该类创建了所有默认的类型转换器。

很明显,CLOB类型调了自定义类型转换器 new CustomTypeHandler(new ClobTypeHandlerCallback())),于是继续跟踪到ClobTypeHandlerCallback.class里面,发现有如下代码:


看来该转换器是调用setCharacterStream以流的方式实现的,这样对于CLOB的处理应该是没有问题的,但实际项目为什么会报异常呢,经过摸索发现,可以按钮如下的sqlMap.xml中写,然后测试,问题解决,注意desc属性对应的写法 DESC = #desc,handler=com.ibatis.sqlmap.engine.type.ClobTypeHandlerCallback#

对于insert同样的方法处理,我测试的项目中select语句没有报错,如报错select中比较直观,可以按如下方法


本人测试环境:

iBatis:ibatis-sqlmap-2.3.0

Spring:Spring-*-3.0.5.REALEASE

Oracle: oracle11g

Oracle驱动: ojdbc14






你可能感兴趣的:(process)