ResultSet.TYPE_FORWARD_ONLY结果集调用relative方法报错原因及解决方案
报错原因
你代码中用到的rs.relative(2)属于JDBC结果集的滚动操作,默认情况下,通过无参conn.createStatement()创建的Statement对象,生成的ResultSet是ResultSet.TYPE_FORWARD_ONLY类型,这类结果集只支持单向向后遍历,仅能调用next()方法移动游标,所有滚动类操作(包括relative、absolute、previous、first等方法)都会触发你遇到的该异常。
相同代码在课程环境可运行的原因
主要是环境差异导致:
- 驱动版本差异:部分旧版本的MySQL Connector/J驱动没有严格遵循JDBC规范校验结果集类型,即使是
TYPE_FORWARD_ONLY类型的结果集调用滚动方法,也会做内部兼容不会报错;你本地使用的是更新版本的驱动,严格执行了规范校验。 - 课程环境全局配置:部分教学环境会在数据库连接参数、驱动初始化环节,全局修改了Statement的默认生成规则,默认就返回可滚动类型的结果集,所以不需要额外指定参数也能正常运行。
额外优化建议
你修改后的指定可滚动结果集的写法是符合规范的标准解法,如果你不想修改结果集类型,也可以用计数器的方式实现隔行读取的需求,性能更优(单向结果集不需要额外缓存全量数据):
public static void ispisiSvakuDruguKnjigu(){ try{ Connection conn = getConnection(); Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery("select * from knjiga"); // 用计数器实现隔行读取 int index = 0; while(rs.next()){ if(index % 2 == 0){ System.out.println(rs.getString("id")+" "+rs.getString("naslov")); } index++; } } catch (Exception e){ e.printStackTrace(); } }
内容的提问来源于stack exchange,提问作者randomuser123
相关产品推荐
相关产品推荐

