maxConnectionsSizePerQuery简单说词
maxConnSizePerQuery
这个不是影响并行执行的,这个是影响结果集是内存的,还是结果集是流式的
如果maxConnSizePerQuery<SqlUnit.size 则为走内存结果集
例如 即你定义的为PerQuery=5,但是最后要执行6条分表 则走内存结果集,执行后将结果集加载到内存中去
如果maxConnSizePerQuery>=SqlUnit.size 则为走流式结果集
例如 即你定义的为PerQuery=5,但是最后要执行5条(或3条)分表 则走流式结果集,执行后结果集为实时获取
连接限制模式的时候涉及到
关于desiredPartitionSize分区 具体的代码详见SQLExecutePrepareTemplate.java类getSQLExecuteGroups
这个主要是给内存结果集(连接限制模式)用的,分成几个区,每个区内的SqlUnit单元复用一个连接,由于每执行一个SqlUnit的结果集构建的时候都会一次性的next()遍历所有后释放游标,可以做连接复用
总结
1.流式结果集 建立连接多 ,但结果集不吃内存,网络实时获取行数据记录
2.内存结果集 建立连接少 ,但一个结果集一次性加载到内存后,释放游标后以此复用连接加载其它结果集
参考说明
关于创建多个连接来持有流式结果集需求的原因
https://blog.csdn.net/nym232/article/details/89240054
- oracle如果开启fetchSize后 同一个连接可以流式的获取结果集,即开启一块内存区域每次取到固定大小的结果集后,再去拿一批
- mysql不支持fetchSize,即始你设置fetchSize后也会将所有的结果集一次性的加载到内存
mysql的变通的方式设置 即可以设置setFetchSize=Integer.MIN_VALUE 会数据库连接一条一条的返回,这样也不会占用内存 但是仍不完美当使用同一个连接分别执行多次查询,在得到多个ResultSet之后,再同时进行结果集的遍历时会报错,
java.sql.SQLException: Streaming result set
com.mysql.jdbc.RowDataDynamic@617f84e0 is still active. No statements may be issued
when any streaming result sets are open and in use on a given connection.
Ensure that you have called .close() on any active streaming result sets before attempting more queries.
换句话来说,对于mysql来说想使用流式结果集的话,必须独占连接
具体的配置
spring.shardingsphere.props.max.connections.size.per.query=50