SpringBoot连接VM中MySQL报max_allowed_packet超限异常排查
问题根因
报错显示服务端允许的最大包大小仅为65535(64KB,MySQL默认初始值),但你查询到的max_allowed_packet为67MB,核心原因是你修改配置、查询参数的MySQL实例,和Spring应用实际连接的3333端口实例不是同一个,或者配置修改未对3333端口的运行实例生效。
注意错误抛出时机是Hikari连接池初始化连接阶段,还未执行你写的业务SQL,因此和你代码中用update方法执行查询的写法错误无关。
排查解决步骤
- 第一步:直连目标端口验证真实参数值
不要用默认连接方式登录MySQL,必须指定3333端口查询参数,避免连到默认3306端口的其他实例:
绝大多数场景下这一步查出来的值就是65535,证明你之前的配置修改都作用在了3306端口的其他MySQL实例上(比如apt安装的系统默认MySQL跑在3306,3333是Docker容器、手动编译部署的另一个独立实例,从未加载过你修改的配置文件)。mysql -h 127.0.0.1 -P 3333 -u boss -p'StrongPass123!' -e "SHOW VARIABLES LIKE 'max_allowed_packet';" - 第二步:修改对应实例的正确配置
先定位3333端口的MySQL进程:
拿到进程PID后执行sudo ss -tulpn | grep 3333ps aux | grep <PID>查看进程启动参数,确认其加载的配置文件路径:- 如果是Docker启动的实例,不要改宿主机的
my.cnf,需要进入容器修改配置,或者启动容器时追加参数--max-allowed-packet=67108864 - 如果是直接部署在宿主机的实例,确认
max_allowed_packet配置写在[mysqld]段下,写在[mysql]、[client]段下仅对客户端命令生效,对服务端无作用,正确配置示例:[mysqld] max_allowed_packet=64M
- 如果是Docker启动的实例,不要改宿主机的
- 第三步:补充配置与代码修复
- JDBC连接URL可以追加客户端侧的包大小参数,避免驱动侧默认限制:
spring.datasource.url = jdbc:mysql://10.0.0.200:3333/test?maxAllowedPacket=67108864- 你代码中使用
jdbcTemplate.update()执行SELECT查询是错误写法,update仅用于INSERT/UPDATE/DELETE等写操作,查询需要使用jdbcTemplate.query()相关方法,否则连接正常后也会触发SQL执行错误。
内容的提问来源于stack exchange,提问作者beatmaister
相关产品推荐
相关产品推荐

