MyBatis游标Cursor在Oracle数据库上的测试方式
作者:isea533
这篇文章主要介绍了MyBatis游标Cursor在Oracle数据库上的测试方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
测试数据的列更多,内容更多,和 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
大小来减少内存占用和数据库交互次数。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。