首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

不允许对类型为ResultSet.TYPE_FORWARD_ONLY的结果集执行操作

问题概述

ResultSet.TYPE_FORWARD_ONLY 是 JDBC(Java Database Connectivity)中定义的一种结果集类型,表示结果集只能向前移动,不能随机访问。这种类型的结果集通常用于优化性能,因为它不需要在内存中缓存所有数据。

基础概念

  • ResultSet: 在 JDBC 中,ResultSet 是一个接口,表示从数据库查询返回的结果集。
  • ResultSet.TYPE_FORWARD_ONLY: 这是 ResultSet 接口中的一个常量,表示结果集只能向前移动。

相关优势

  • 性能优化: 由于不需要在内存中缓存所有数据,TYPE_FORWARD_ONLY 结果集可以减少内存使用,提高性能。
  • 简单性: 对于只需要顺序访问结果集的场景,使用 TYPE_FORWARD_ONLY 可以简化代码逻辑。

类型

JDBC 定义了几种不同的 ResultSet 类型:

  • TYPE_FORWARD_ONLY: 结果集只能向前移动。
  • TYPE_SCROLL_INSENSITIVE: 结果集可以随机访问,并且对数据库的修改不敏感。
  • TYPE_SCROLL_SENSITIVE: 结果集可以随机访问,并且对数据库的修改敏感。

应用场景

TYPE_FORWARD_ONLY 结果集适用于以下场景:

  • 顺序访问: 当你需要按顺序处理查询结果时。
  • 大数据集: 当查询结果集非常大时,使用 TYPE_FORWARD_ONLY 可以避免内存溢出。

遇到的问题及原因

问题: 不允许对类型为 ResultSet.TYPE_FORWARD_ONLY 的结果集执行某些操作。

原因: TYPE_FORWARD_ONLY 结果集的设计限制了其只能向前移动,不能进行随机访问或执行某些需要随机访问的操作,例如:

  • 使用 ResultSet.absolute(int row)ResultSet.relative(int rows) 方法。
  • 使用 ResultSet.first()ResultSet.last()ResultSet.previous() 等方法。

解决方法

  1. 更改结果集类型: 在创建 StatementPreparedStatement 时,指定一个支持随机访问的结果集类型,例如 TYPE_SCROLL_INSENSITIVETYPE_SCROLL_SENSITIVE
  2. 更改结果集类型: 在创建 StatementPreparedStatement 时,指定一个支持随机访问的结果集类型,例如 TYPE_SCROLL_INSENSITIVETYPE_SCROLL_SENSITIVE
  3. 调整代码逻辑: 如果只需要顺序访问结果集,确保代码中没有尝试执行随机访问操作。
  4. 调整代码逻辑: 如果只需要顺序访问结果集,确保代码中没有尝试执行随机访问操作。

参考链接

通过以上方法,你可以解决不允许对 TYPE_FORWARD_ONLY 结果集执行某些操作的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

线上采用 IBatis 逻辑分页导致 SQL 慢查询问题排查

SQL,为什么还要学习其他东西 全自动化 使用 ibatis提供 ORM机制,业务逻辑实现人员而言,面对是纯粹 Java对象, 这一层与通过 Hibernate 实现 ORM 而言基本一致,而对于具体数据操作...从代码中可以看出 ibatis分页查询逻辑是首先判断 ResulteSet类型,如果 ResultSet类型ResultSet.TYPE_FORWARD_ONLY,则使用ResultSet...一般情况下,我们都使用 FORWARD_ONLY类型 ResultSet, SCROLL类 型 ResultSet优点是可向前,向后滚动,并支持精确定位( absolute),但缺点是把结果全部加载进缓存...在框架基础上实现物理分页 需求分析 框架自身问题有两个: 在于分页实现是在结果返回之后,所以我们面对问题是,在 SQL执行之前实现分页 SQL分页拼接。...在执行器中执行后,告诉结果处理器不在进行逻辑分页处理,直接采用 SQL查询结果,作为最终结果

1.1K10

java:JDBC详解

SUN公司为了简化、统一数据库操作,定义了一套Java操作数据库规范,称之为JDBC。 简单说,JDBC意义在于在Java程序中执行SQL语句。...executeBatch():向数据库发送一批sql语句执行。 Jdbc程序中ResultSet用于代表Sql语句执行结果。Resultset封装执行结果时,采用类似于表格方式。...ResultSet既然用于封装执行结果,所以该对象提供大部分方法都是用于获取数据get方法: 获取任意类型数据 getObject(int index) getObject(string columnName...Statement st=con.createStatement(); ResultSet rs=st.executeQuery(sql); 这是一个默认结果:只能向下执行,并且只能迭代一次。...afterLast() :移动到resultSet最后面 updateRow() :更新行数据 ResultSet还提供了结果进行滚动和更新方法 Statement stmt = conn.createStatement

91750
  • JDBC中核心对象

    能生成什么样结果 四、Statement Statement最为重要方法是: int executeUpdate(String sql):执行更新操作,即执行insert、update、delete...sql):执行查询操作执行查询操作会返回ResultSet,即结果。...该方法返回是boolean类型,表示SQL语句是否有结果!。...第二个参数: CONCUR_READ_ONLY:结果是只读,不能通过修改结果而反向影响数据库; CONCUR_UPDATABLE:结果是可更新结果更新可以反向影响数据库。...resultSetConcurrency可选值: l CONCUR_READ_ONLY:结果是只读,不能通过修改结果而反向影响数据库; l CONCUR_UPDATABLE:结果是可更新结果更新可以反向影响数据库

    54210

    Connection 对象简介 方法解读 JDBC简介(四)

    三个版本createStatement核心是一样,区别在于参数设置,参数设置是针对于结果 空参数createStatement返回Statement 对象,创建结果在默认情况下类型...SQL,并且附带可以设置结果类型、并发性、可保存性 动态执行对象创建prepareStatement PreparedStatement prepareStatement(String sql)...然后可以有效地使用此对象来多次执行该语句。 结果属性在默认情况下类型 TYPE_FORWARD_ONLY,并带有 CONCUR_READ_ONLY 并发级别。...核心创建存储过程执行对象,另外与createStatement和prepareStatement方法类似,可以设置结果类型、并发性、可保存性。...也可以对结果参数进行设置 事务相关处理也是在连接中操作

    1.2K20

    java底层代码jdbc,sql 部分,随堂笔记1

    connection(con)中prepareStatment方法 //3.ResultSet rs = pstmt.executeQuery() //获取使用sql语句后查询到结果,用rs接收...(parameterIndex, x); //设置参数,1指是第一列,x指的是要插入参数 //5.sql 后ResultSet.TYPE_* @Override public Set<MyUser...try (PreparedStatement pstmt = con.prepareStatement("SELECT userId,userName,password from myuser", ResultSet.TYPE_FORWARD_ONLY..., ResultSet.CONCUR_READ_ONLY)) { set = new HashSet(); /*ResultSet.CONCUR_READ_ONLY只读类型ResultSet.TYPE_FORWARD_ONLY...表示上述类型属性,此处向前只读 此种方法效率较高,比如,一共三百个字节,每次读100个,读完前100之后, 删除掉再继续读中间100个*/ try (ResultSet rs = pstmt.executeQuery

    29520

    JavaWeb(四)JDBC操作Oracle

    JDBC:Java DataBase Connectivity(java数据库连接) SUN公司为了简化、统一数据库操作,定义了一套Java操作数据库规范,称之为JDBC。...语句,返回ResultSet 结果对象 execute 用于数据库发送任何SQL语句(包括 DDL DML DCL) 返回boolean ,SQL执行结果是ResultSet 返回true,否则 false...发送多条SQL addBatch(sql) 将SQL加入批处理队列 executeBatch() 执行队列中所有SQL语句 ,一次性向数据库发送多条SQL 使用ResultSet 遍历结果 while...(int resultSetType, int resultSetConcurrency) 在创建Statement对象 设置结果类型,并发策略 结果类型 ResultSet.TYPE_FORWARD_ONLY...  支持结果向回滚动,查看修改结果 结果并发策略 ResultSet.CONCUR_READ_ONLY 只读 ResultSet.CONCUR_UPDATABLE 支持修改 常见三种组合 ResultSet.TYPE_FORWARD_ONLY

    1.4K40

    使用MySQL Server Side Cursor解决查询数据量过大造成OOM

    要使用MySQL Server Side游标需要满足下面条件: 必须是select语句 设置了fetchSize>0 在mapper文件里面设置 设置了useCursorFetch=true 数据类型...ResultSet.TYPE_FORWARD_ONLY 数据并发设置ResultSet.CONCUR_READ_ONLY 在数据库链接后面设置:jdbc:mysql://localhost:3306...= null && this.useCursorFetch && getResultSetType() == ResultSet.TYPE_FORWARD_ONLY && getResultSetConcurrency...,然后就会把记录发送到自己发送buffer,等buffer满了就flush缓存(这里要注意是如果client接受缓存满了,那么Server发送就会阻塞主,直到client接受缓存空闲。)...mysqlclient获取fetchSize个记录放到mysqlclient游标内部数组里面,游标获取时候是从数组里面获取数据,如果数组空了,在向buffer获取fetchSize个记录。

    1.7K10

    彻底搞懂JDBC运行过程

    我们可以用它来连接数据库,执行SQL查询,存储过程,并处理返回结果。 JDBC接口让Java程序和JDBC驱动实现了松耦合,使得切换不同数据库变得更加简单。 ?...执行一个查询 需要使用一个类型Statement或PreparedStatement对象(两者区别看后文),并提交一个SQL语句到数据库执行查询。 5....数据库隔离级别越高性能越差,确保你数据库连接设置隔离级别是最优。 如果你需要长时间ResultSet进行操作的话,尽量使用离线RowSet。...在查询数据库后会返回一个ResultSet,它就像是查询结果一张数据表。...ResultSet对象有三种类型ResultSet.TYPE_FORWARD_ONLY:这是默认类型,它游标只能往下移。

    2.1K50

    mybatis 分页原理_分页机结构原理

    Mybatis可以通过传递RowBounds对象,来进行数据库数据分页操作,然而遗憾是,该分页操作ResultSet结果进行分页,也就是人们常说逻辑分页,而非物理分页。...= ResultSet.TYPE_FORWARD_ONLY) { if (rowBounds.getOffset() !...for (int i = 0; i < rowBounds.getOffset(); i++) { rs.next(); } } } 说明,Mybatis分页是结果进行分页...假设查询结果总共是100条记录,而我们只需要分页后10条,是不是意味着100条记录在内存中,我们对内存分页获得了10条数据呢?...因此,Mybatis逻辑分页性能,并不像很多人想那么差,很多人认为是对内存进行分页。 ---- 最优方案,自然是物理分页了,也就是查询结果,就是我们分页后结果,性能是最好

    48450

    Oracle数据库性能优化(Hbase是什么数据库)

    答案肯定是否定。首先大部份数据库都会有SQL长度和IN里个数限制,如ORACLEIN里就不允许超过1000个值。...fetchsize并不会存在一个最优固定值,因为整体性能与记录大小及硬件平台有关。根据测试结果建议当一次性要取大量数据时这个值设置100左右,不要小于40。...这里需要注意是,采用resultset游标处理记录时,应该将游标的打开方式设置FORWARD_READONLY模式(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY...如果在共享池中未发现相同SQL则根据SQL逻辑生成一条新执行计划并保存在SQL缓存区中,然后根据执行计划读取数据并返回结果给客户端。...Exists子查询 In子查询 Not In子查询 Union(并),Union All也是一种并操作,但是不会发生排序,如果你确认两个数据不需要执行去除重复数据操作

    1.3K30

    Mybatis源码学习第六天(核心流程分析)之Executor分析(补充)

    还是说一下吧; StatementHandler完成了Mybatis最核心工作,也是Executor实现基础,功能包括:创建Statement对象,Sql语句绑定参数,执行增删改查等Sql语句,将结果映射进行转化...ResultMap 15 handleResultSet(rsw, resultMap, multipleResults, null);//根据映射规则结果进行转换,转化成目标对象放入multipleResultSet...属性列出多了结果名称,用逗号分隔       // 多结果处理不是重点,暂时不分析 21 String[] resultSets = mappedStatement.getResultSets...hasTypeHandlerForResultObject(rsw, resultMap.getType())) {       // 目标对象封装得到metaObject,后续赋值操作做准备...PARTIAL,明确指定映射规则字段进行自动映射 8 foundValues = applyAutomaticMappings(rsw, resultMap, metaObject

    29640

    MyBatis中使用流式查询避免数据量过大导致OOM

    设置后最后会调用MysqlIOsqlQueryDirect方法执行具体sql并把结果resultset存放到JDBC4PrepardStatement中。...read函数 read函数作用是从结果resultset中获取数据,首先调用.next判断是否有数据,有的话则读取数据。 这和纯粹JDBC编程方式就一样了,只是read函数其进行了包装。...ResultSet游标让用户自己迭代获取数据,而现在是内部直接操作ResultSet逐条获取数据并调用回调handlerhandleResult方法进行处理。...虽然解析执行时候会有点开销(比如每次调用都是反射进行),但是同时还提供了缓存。...对于同等条件下搜索结果600万条记录时候使用游标与不使用时候内存占用对比: 非流式 ? image.png 流式 ?

    8.1K10

    面试官:从 MySQL 数据库里读取 500w 数据行进行处理,应该怎么做更效益化?

    ResultSet,并且无法在 JVM 中其分配所需内存堆空间,则可以告诉驱动程序从结果流中返回一行 流式查询有一点需要注意:必须先读取(或关闭)结果集中所有行,然后才能对连接发出任何其他查询,否则将引发异常...使用流式查询,则要保持产生结果语句所引用并发访问,因为其 查询会独占连接,所以必须尽快处理 @SneakyThrows public void streamQuery() { @Cleanup...,所在 JVM 可能会凉凉,原因如下: MySQL Server 会将检索出 SQL 结果通过输出流写入到内核对应 Socket Buffer 内核缓冲区通过 JDBC 发起 TCP 链路进行回传数据...,此时另一连接该表造成 DML 写入操作应该如何处理?...,占用大量磁盘空间以及性能 (3)流式查询 当客户端与 MySQL Server 端建立起连接并且交互查询时,MySQL Server 会通过输出流将 SQL 结果返回输出,也就是 向本地内核对应

    2.1K30

    Jdbc知识点全整理,你值得拥有 ​(1)

    ):执行查询操作,数据库在执行查询后会把查询结果,查询结果就是ResultSet; ResultSet对象表示查询结果,只有在执行查询操作后才会有结果产生。...参数指定穿上连接数据库过程中,使用字节编码UTF-8编码。...JDBC来执行这些语句; ResultSet executeQuery(String sql):执行查询操作执行查询操作会返回ResultSet,即结果。...该方法返回是boolean类型,表示SQL语句是否执行成功。...resultSetConcurrency可选值: CONCUR_READ_ONLY:结果是只读,不能通过修改结果而反向影响数据库; CONCUR_UPDATABLE:结果是可更新结果更新可以反向影响数据库

    1.2K40

    Java豆瓣电影爬虫——减少与数据库交互实现批量插入

    解决方法:对于种子网站既然没有存储到record操作,那么就种子网站做特殊处理,将if判断条件改为if (stmt.executeUpdate(sql) > 0 || frontPage.equals...(url)),这样对于种子网站即使没有update更新成功操作仍然可以进入读取数据库crawled0 操作。...针对第二个问题,采用一次查询多条记录 实现思路:将每次只查询一条记录,改为每次查询10条记录,并将这10条记录存放到list集合中,并将原来String类型url改为list类型urlList传入到...添加conn.setAutoCommit(true);表示更新操作设置自动提交,这样就可以解决虽然程序执行成功但是数据没有更新到数据库现象。 针对第三个问题,与第一个问题解决方法相同。...如果您觉得阅读本文您有帮助,请点一下“推荐”按钮,您“推荐”将是我最大写作动力!

    1.1K72

    DB2错误代码_db2错误码57016

    +466 01610 指定由命名存储过程返回查询结果个数。...成功完成 +494 01614 由存储过程返回结果个数超过了由ASSOCIATE LOCATORS语句指定结果定位器个数 +495 01616 因为倒台SQL成本估算超出了在ELST中指定警告阀值...DB2象上执行命名操作权限 +552 01542 命名授权ID缺少执行命名操作权限 +558 01516 已经被授权该PUBLIC,因此WITH GRANT OPTION不可用 +561 01523...-421 42826 UNION操作选择列表中没有提供相同数目的列 -423 0F001 LOB或结果定位器指定值无效 -426 2D528 在不允许更新应用服务器不允许执行COMMIT语句...-497 54041 指定数据库超过了32767 OBID上限,或者CREATE DATABASE语句使之达到了32511DBID上限 -499 24516 指定游标已被分配到结果,该结果来自已经指定存储过程

    2.6K10
    领券