jdbc连接oracle 设置fetchsize过大,报 违反协议异常

在使用Oracle JDBC驱动时,发现ResultSet::setFetchSize()函数会导致数据读取异常,表现为获取的数据与数据库实际数据不符。若通过Statement设置FetchSize则问题解决。

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

 

根据JDK JDBC文档,ResultSet::setFetchSize()函数语义为 JDBC 驱动程序设置此 ResultSet 对象需要更多行时应该从数据库获取的行数。如果指定的获取大小为零,则 JDBC 驱动程序忽略该值,随意对获取大小作出它自己的最佳猜测。默认值由创建结果集的 Statement 对象设置。获取大小可以在任何时间更改。

但在实际使用Oracle JDBC驱动时,我们开发的程序发生了莫名的错误,总是会出现获取到的取值与数据库实际取值不一致的情形,经过仔细的测试与排查,我们发现是由于ResultSet::setFetchSize()函数调用导致的错误,在我们的测试环境中,Oracle JDBC缺省为ResultSet设定的大小为10,如果我们将其改编为100,那么一般会在获取第11条记录的第一个取值时发生获得取值与数据库实际取值不一致的问题,引发问题的语句如下:

 ResultSet equipRs = roleStat.executeQuery();
 if(equipRs.getFetchSize() < 20)
  equipRs.setFetchSize(20);

但如果我们调用Statement的setFetchSize()函数预先设置FetchSize为期望的值,则不会引发问题:

 roleStat.setFetchSize(20); // 调用Statement的setFetchSize()方法不会引发问题
 ResultSet equipRs = roleStat.executeQuery();

因此,我们怀疑这是Oracle JDBC实现的一个BUG,测试运行环境如下:
1. Oracle 10201_database_win32.zip 服务器版本
2. JDBC为10201_database_win32安装中Oracle10.2.0/Server/jdbc/lib/目录下的class12.jar和ojdbc14.jar两个版本都测试过

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值