一套 Spring Cloud 微服务 MES 里,一个”检验暂存”接口突然全量报错。报错很吓人:MyBatis 抛 BadSqlGrammarException,底层是 MySQLSyntaxErrorException: You have an error in your SQL syntax——语法错误,直指 mapper 写错了。但这条 SQL 在代码库里已经跑了很久,一行没改,而且”之前测试都是正常的”。
事后看,SQL 本身没有任何问题,问题出在 JDBC 连接串:换数据库时给 database.url 加了一个 ?sslMode=DISABLED 参数,和公共配置里追加的 ?allowMultiQueries=true 拼出了两个问号。驱动解析 URL 时只认第一个问号,第二个问号后面的整段参数被吞进前一个参数的值里——allowMultiQueries 这个键从未存在过,静默回退默认值 false,所有多语句 SQL 集体阵亡。
这个坑的迷惑性在于三层错位:报错在 mapper 层,根因在配置层;丢失的参数只有一个,其余功能全部正常;配置改完不会立刻炸,等到服务重启那天才引爆。这篇复盘把三层错位逐一拆开,重点讲清楚多语句 SQL 为什么天生依赖连接参数、双问号是怎么静默废掉它的。