mybatis mysql cursor_springBoot集成mybatis后使用Cursor逐个遍历大量数据的问题

本文讨论了在SpringBoot中使用MyBatis的Cursor特性处理大量数据库记录的问题。通过设置fetchSize为Integer.MIN_VALUE以适应MySQL,避免一次性加载所有数据导致内存溢出。讨论中提到了Cursor在后台进程流式读取大表并逐条处理数据的场景,以及事务管理和连接管理的相关注意事项。同时,建议考虑分页或流式处理作为替代方案。

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

mapper层: @Select("select SNO,SNAME,SSEX from student") [email protected](fetchSize = Integer.MIN_VALUE)//mysql情况比较特殊,只能这样设置 C

映射器层:

@ select ("select SnO,sname,ssex from student ")

//@ options(fetch size = integer。min _ value)//MySQL比较特殊,只能这样设置

光标

单元测试:

@ test

@ transactional

public void testmybaticsursor(){

游标

wad12302

04/27 10:15

为什么要用光标?正常分页不好。

晓夜寒光

04/28 08:17

分页一般习惯整合pagehelper去搞,一般用于页面展示比较多。

这个需求是后台进程流式读取一张大表,对每条数据做响应的处理,这样是不是用流式会不会好点,还希望请教下。

Kit_lee

04/27 10:19

难道没有必要添加交易注释吗?映射器似乎不会自动接受事务注释,只有SpringData [email protected]

您编写一个服务层方法来包装您的代码,[email protected],测试类将不会被使用

晓夜寒光

04/28 14:59

回复 @Kit_lee : 这是一个很合理的解释而且值得去证明下,谢谢你。我是论坛新用户,没有积分,若有定补上。

Kit_lee

04/28 10:05

回复 @晓夜寒光 : 这应该是个误解,游标基本上是JDBC ResultSet的一个包装器。为了从游标获取值,应该打开底层的ResultSet。如果在整个循环期间没有事务,那么在执行查询时,spring会在你调用mysqlStudentMapper.queryByCursor前打开连接,方法完成后,连接被关闭,所以游标使用的ResultSet也被关闭了。

晓夜寒光

04/28 08:13

不知道这个理解有没有偏差

晓夜寒光

04/28 08:12

我的理解是游标的遍历属于查询,不需要保证事务特性,[email protected]

04/28 17:24

[email protected]actional,当查询方法返回时,连接将返回到DS。返回连接后,光标必须为空

另外,如果是数据库,即使是为了内存计算,也可以分页读取,比如1000页。看完一页数据,就交给计算模块计算。算了一下,看下一页就相当于一个个处理,而不是一个个处理。这样也可以做成类代消费法。生成器负责将数据库中的数据添加到队列中,消费者可以处理数据并控制内存。

小99

04/28 20:10

Android

问个根本问题,为什么要逻辑分页不用物理分页?是必须这么要求的吗

qfsz168

今天 11:15

添加东西,为了保持数据库连接,否则,取数据一次后,连接会返回。携带网上看到的文章:新技能MyBatis数据表,快速分页!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值