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
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值