MyBatis游标Cursor在Oracle数据库上的测试

文章对比了不同fetchSize设置下,MyBatis的Cursor处理大量数据时的内存占用、执行时间和GC行为。结果显示,调整fetchSize能显著影响性能和内存消耗,较小的fetchSize可能导致更多GC活动,而适当增大fetchSize可以提高效率。2.5情况(fetchSize=10000,内存限制50MB)表现出较好的平衡。

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

测试数据的列更多,内容更多,和 MyBatis游标Cursor的正确用法和百万数据传输的内存测试 不同,占用内存没有可比性。

1.1. 不配置内容,查询全部,99万数据

在这里插入图片描述
内存缓慢增长,12分钟都没有查询完。

1.2. 初始2G内存,最大4G内存,fetchSize=10000

当不设置fetchSize时,Oracle默认10,内存增长和1一样缓慢,查看源码发现Oracle默认为10:
在这里插入图片描述
为了更快的测试出结果,这里设置10000。
在这里插入图片描述查询过程耗时:54764ms
GC:20次
占用内存:1582MB

2.1. Cursor查询,一条一条处理

在这里插入图片描述
默认的fetchSize=10,内容没有持续增加,但是执行时间仍然很长。5分钟没有完成,直接终止运行。

2.2 Cursor查询,fetchSize=10000

在这里插入图片描述
查询过程耗时:49340ms
GC:36次
占用内存:164MB

2.3 Cursor查询,fetchSize=1000,内存限制20MB

在这里插入图片描述
在这里插入图片描述
查询过程耗时:124113ms
GC:4563次
GC耗时:73337ms
占用内存:19MB
一半的时间在GC,吞吐量只有41%。

2.4 Cursor查询,fetchSize=100,内存限制20MB

在这里插入图片描述
查询过程耗时:390714ms
GC:4631次
GC耗时:95130ms
占用内存:18MB
GC耗时很长,吞吐量只有76%。

7分钟才执行完,

2.5 Cursor查询,fetchSize=10000,内存限制50MB

在这里插入图片描述
查询过程耗时:42044ms
GC:158次
GC耗时:173ms
占用内存:42MB

总结

除了上面的列出的几种情况下,还试过多种不同的配置,耗时没有比2.5更好。

除了MySQL中需要通过fetchSize = Integer.MIN_VALUE作为标记开启流式传输外,其他数据库都是正常的用法,通过控制 fetchSize 大小来减少内存占用和数据库交互次数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

isea533

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值