Size Data Unit (SDU) mismatch错误及java.sql.SQLExcept

本文探讨了业务系统中出现的SDU不匹配与Io异常问题,特别是在使用JDBC连接ORACLE数据库时发生的InvalidPacketLength错误。通过更换数据库驱动从class12.jar到ojdbc14.jar,有效避免了此问题,确保了系统的稳定运行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这几天业务系统已经出现两次当机了,查找后台报错: io 异常: Size Data Unit (SDU) mismatch。

另外还存在
Caused by: java.sql.SQLException: Io 异常: Invalid Packet Lenght

环境配置:JDK1.4+WAS6.0+ORACLE9.2.0.1.0

网上查找有的网友也出过这个错误,他说程序刷新多次后就出现这个问题,用的是hibernate3.0,其中有读取clob字段的代码。虽然我这用的是JDBC,我也不知道这个错到底是怎么产生的。这类偶然性发生的错误很令人头痛,而且一出现就导致WAS中应用程序停掉。

但后有网友认为“这是由于数据库驱动版本造成的,如果是ORACLE的话,一般项目用class12.jar数据库驱动包,在那种连接池多线程并发的情况下,会出现这种错误,而且往往造成web服务器死机,解决办法是更新你的驱动用ojdbc14.jar数据库驱动包来替换class12.jar,也许会解决你的问题”

于是下了ORACLE9.2.0.1.0 对应的ojdbc驱动试试,希望有用:

驱动包classes12.jar用于JDK 1.2和JDK 1.3,而ojdbc14.jar用于JDK 1.4及以上,所以尽量不要使用classes12.jar;

针对不同的数据库版本选择相应版本的驱动包;

将驱动包置入应用启动的classpath中(jboss的lib或者项目lib)

可通过如下链接下载到对应的驱动包:http://www.oracle.com/technology/software/tech/java/sqlj_jdbc/htdocs/jdbc9201.html
<think>好的,我现在需要解决用户提供的这个错误信息。首先,错误信息显示的是一个Java的ReflectionException,具体是无法将'cn.sdu.mall.pojo.Item'类的'id'属性设置为'1942398597346349058',原因是参数类型不匹配。我需要分析可能的原因,并给出解决方案。 首先,用户提到的错误发生在使用MyBatis时,涉及到反射设置属性值的问题。可能的原因是什么呢?通常这种情况下,MyBatis在映射数据库结果到Java对象时,数据库中的数据类型与Java类中的属性类型不匹配。比如,数据库中的id字段是BIGINT类型,而Java类中的id属性可能是int或者Integer类型,而不是更长的范围类型如long或Long。当数据库中的值超过了Java类型的最大值时,就会导致类型不匹配的问题。 接下来,我需要验证这个可能性。例如,假设数据库中的id是BIGINT UNSIGNED,其值可能非常大,而Java的int最大值是2^31-1(约21亿),而错误中的数值1942398597346349058显然超过了这个范围。因此,如果Item类中的id字段被定义为int或Integer,就会导致无法正确转换,从而抛出IllegalArgumentException。 解决方法应该是将Java类中的id属性类型改为long或Long类型,因为long可以存储更大的数值范围(从-2^63到2^63-1)。同时,还需要检查MyBatis的映射配置文件或注解,确保数据库的BIGINT类型正确地映射到Java的Long类型。例如,在MyBatis的XML映射文件中,应该为该列指定javaType为long或java.lang.Long,或者在使用注解时正确配置类型处理。 另外,可能还需要检查数据库驱动是否正确处理了大数值。例如,MySQLJDBC驱动在处理BIGINT类型时,默认情况下可能会将其作为Long对象返回,但如果配置不当,可能会返回其他类型,导致转换问题。因此,确保数据库驱动版本和配置正确也是关键。 此外,用户可能还需要确认MyBatis的版本是否支持自动类型转换,或者是否需要自定义类型处理器(TypeHandler)。如果数据库和Java类型之间的转换需要特殊处理,可能需要编写自定义的TypeHandler来确保正确的转换。 总结一下,主要的解决步骤应该是:检查并修改Item类中的id字段类型为Long或long;验证MyBatis映射配置中的类型映射是否正确;确保数据库驱动正确处理大数值类型。这样应该能解决参数类型不匹配的问题。</think>该错误表明MyBatis在尝试将数据库值`1942398597346349058`赋给`Item`类的`id`字段时发生类型不匹配。常见原因及解决方案如下: 1. **Java字段类型不匹配** 若数据库字段为`BIGINT`(如MySQL)Java端应使用`long`/`Long`类型(而非`int`/`Integer`)。示例修正: ```java public class Item { private Long id; // 原为int/Integer时会溢出 // 其他字段和getter/setter } ``` 2. **MyBatis映射配置缺失** 在MyBatis XML映射文件中显式指定类型转换: ```xml <resultMap id="ItemMap" type="cn.sdu.mall.pojo.Item"> <id column="id" property="id" javaType="long"/> <!-- 其他字段映射 --> </resultMap> ``` 或使用注解: ```java @Results({ @Result(property = "id", column = "id", javaType = Long.class) }) ``` 3. **数据库驱动返回类型问题** 某些JDBC驱动可能返回`String`而非数值类型。可通过自定义`TypeHandler`强制转换: ```java public class LongTypeHandler extends BaseTypeHandler<Long> { @Override public void setNonNullParameter(PreparedStatement ps, int i, Long parameter, JdbcType jdbcType) { ps.setString(i, parameter.toString()); } @Override public Long getNullableResult(ResultSet rs, String columnName) { return Long.valueOf(rs.getString(columnName)); } } ``` 并在MyBatis配置中注册: ```xml <typeHandlers> <typeHandler handler="com.example.LongTypeHandler" javaType="java.lang.Long"/> </typeHandlers> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值