<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>踩坑 on FXIO 技术博客</title><link>https://fxio.site/tags/%E8%B8%A9%E5%9D%91/</link><description>Recent content in 踩坑 on FXIO 技术博客</description><generator>Hugo -- 0.157.0</generator><language>zh-cn</language><lastBuildDate>Wed, 10 Jun 2026 01:30:00 +0800</lastBuildDate><atom:link href="https://fxio.site/tags/%E8%B8%A9%E5%9D%91/index.xml" rel="self" type="application/rss+xml"/><item><title>Presto 驱动升级引发的生产事故：超长 SQL 400 报错排查记</title><link>https://fxio.site/posts/java/presto-driver-upgrade-bug/</link><pubDate>Wed, 10 Jun 2026 01:30:00 +0800</pubDate><guid>https://fxio.site/posts/java/presto-driver-upgrade-bug/</guid><description>&lt;h2 id="问题现象"&gt;问题现象&lt;/h2&gt;
&lt;p&gt;普通 SQL 正常，stg 环境没发现异常。但生产环境用户反馈：&lt;strong&gt;超长 SQL（超过 1MB）会触发 400 报错&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;恰好生产环境的用户有很多那种业务逻辑复杂、拼接出来的超长 SQL。&lt;/p&gt;
&lt;h2 id="排查过程"&gt;排查过程&lt;/h2&gt;
&lt;p&gt;第一步是对比。把报错的 SQL 和不报错的 SQL 摆在一起看，唯一的共同点就是——&lt;strong&gt;长&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;短 SQL 跑得好好的，长到一定长度就 400。这不是 SQL 语法问题，是传输层的问题。&lt;/p&gt;
&lt;h2 id="根因"&gt;根因&lt;/h2&gt;
&lt;p&gt;查到最后，原因是这样的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;安全合规要求&lt;/strong&gt;，把普通的 &lt;code&gt;Statement&lt;/code&gt; 升级为 &lt;code&gt;PreparedStatement&lt;/code&gt;。因为普通 Statement 有 SQL 注入风险，安全团队要求整改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Presto 驱动版本太低&lt;/strong&gt;，低版本的 Presto JDBC 驱动对 &lt;code&gt;PreparedStatement&lt;/code&gt; 的支持不完善，特别是对超长 SQL 的处理有 bug。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;服务端 Presto 没有同步升级&lt;/strong&gt;。原因很简单——影响太大，涉及的下游服务和业务太多，不敢动。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以就出现了一个尴尬的局面：客户端驱动升级了（为了安全），服务端没升级（为了稳定），两边版本不一致，超长 SQL 直接 400。&lt;/p&gt;
&lt;h2 id="解决方案"&gt;解决方案&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;还原升级。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把客户端驱动退回到兼容当前服务端的版本。安全问题用其他方式规避（比如在应用层做参数化查询、输入校验等）。&lt;/p&gt;
&lt;p&gt;这不是最优解，但在&amp;quot;安全&amp;quot;和&amp;quot;可用&amp;quot;之间，先保可用。&lt;/p&gt;
&lt;h2 id="避坑建议"&gt;避坑建议&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;1. 灰度环境重点覆盖验证&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;stg 环境为什么没发现？因为测试用的 SQL 都是短的。灰度环境应该&lt;strong&gt;重点覆盖边界场景&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;超长 SQL（1MB+）&lt;/li&gt;
&lt;li&gt;特殊字符&lt;/li&gt;
&lt;li&gt;高并发场景&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2. 客户端和服务端版本要对齐&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;升级驱动前，先确认服务端版本兼容性。不要客户端升了、服务端没升，两边版本不一致是定时炸弹。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. 安全整改要评估影响面&lt;/strong&gt;&lt;/p&gt;</description></item></channel></rss>