MariaDB Connector/J 3 如何替代 useBatchMultiSend?
针对题述的批处理 pipeline 兼容性问题,可在 JDBC URL 中设置 disablePipeline=true。MariaDB Connector/J 3.5.7 的源码支持该选项,设置后可关闭先连续发送请求、再读取响应的执行方式。3.5.7 配置源码
为什么这个设置能解决断连
题述问题的触发条件是:驱动还未收到上一条查询的响应,就发送下一条 Query。所用的 ProxySQL 环境将这种交互判为协议错误,并关闭连接。
在 3.5.7 的 StandardClient.executePipeline() 实现中,启用 disablePipeline 后,驱动会逐条调用 execute(),完成每条请求和响应;未启用时,驱动会先发送多个请求,再读取响应。批处理 pipeline 实现
如何修改连接配置
在指向 ProxySQL 的 JDBC URL 中加入:
jdbc:mariadb://127.0.0.1:6033/my_database?disablePipeline=true
示例中的地址、端口和数据库名需要替换为实际配置。如果 URL 已有查询参数,用 & 追加:
jdbc:mariadb://127.0.0.1:6033/my_database?connectTimeout=5000&disablePipeline=true
修改后重新建立物理连接。使用连接池时,应让旧连接退出并创建新连接。随后分别验证批量 INSERT 和批量 UPDATE,检查执行结果及 ProxySQL 日志,确认原来的协议错误是否消失。
能否同时使用 rewriteBatchedStatements
可以。在支持该选项的版本中,可按需要组合配置:
jdbc:mariadb://127.0.0.1:6033/my_database?disablePipeline=true&rewriteBatchedStatements=true
rewriteBatchedStatements=true 会将符合条件的批量 INSERT 改写为多值 INSERT,例如将多组参数合并为:
INSERT INTO ab (i) VALUES (1), (2);
它只处理适合改写的 INSERT,不能替代关闭 pipeline 的设置来解决批量 UPDATE 的同类问题。官方文档注明,该选项在 3.0.0 至 3.5.5 中被忽略,从 3.5.6 起重新支持;启用后会强制将 useServerPrepStmts 设为 false。连接参数说明
使用时需要注意什么
关闭 pipeline 后,请求之间的重叠会减少,网络延迟较高时可能降低批处理吞吐量。建议使用实际负载评估影响。
这里核对的是 3.5.7 的实现,不能据此认定所有早期 3.x 版本都支持同一配置。使用其他版本时,应确认该版本是否包含 disablePipeline。如果修改后仍然断连,还需结合日志判断是否存在其他原因;这一设置针对的是题述的请求发送顺序问题。
备注:内容仅供参考。
