首页
学习
活动
专区
工具
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

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:结果集是可更新的,对结果集的更新可以反向影响数据库

55310
  • 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

    92250

    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

    29920

    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的逻辑分页性能,并不像很多人想的那么差,很多人认为是对内存进行的分页。 ---- 最优方案,自然是物理分页了,也就是查询结果,就是我们分页后的结果,性能是最好的。

    48950

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

    答案肯定是否定的。首先大部份数据库都会有SQL长度和IN里个数的限制,如ORACLE的IN里就不允许超过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

    30440

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

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

    8.2K10

    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更新成功操作仍然可以进入读取数据库crawled为0 的操作。...针对第二个问题,采用一次查询多条记录 实现思路:将每次只查询一条记录,改为每次查询10条记录,并将这10条记录存放到list集合中,并将原来的String类型的url改为list类型的urlList传入到...添加conn.setAutoCommit(true);表示更新操作设置为自动提交,这样就可以解决虽然程序执行成功但是数据没有更新到数据库的现象。 针对第三个问题,与第一个问题解决方法相同。...如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!

    1.1K72

    面试官:从 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.2K30

    数据库SQL优化大总结1之- 百万级数据库优化方案

    对小型数据集使用 FAST_FORWARD 游标通常要优于其他逐行处理方法,尤其是在必须引用几个表才能获得所需的数据时。在结果集中包括“合计”的例程通常要比使用游标执行的速度快。...fetchsize并不会存在一个最优的固定值,因为整体性能与记录集大小及硬件平台有关。根据测试结果建议当一次性要取大量数据时这个值设置为100左右,不要小于40。...SQL对应的执行计划,根据执行计划读取数据并返回结果给客户端。...All也是一种并集操作,但是不会发生排序,如果你确认两个数据集不需要执行去除重复数据操作,那请使用Union All 代替Union。...Minus(差集) Intersect(交集) Create Index Merge Join,这是一种两个表连接的内部算法,执行时会把两个表先排序好再连接,应用于两个大表连接的操作。

    5.6K90
    领券