news 2026/5/1 5:43:27

“An I/O error occurred while sending to the backend” 时,可能是你的 SQL 参数超过了 32767

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
“An I/O error occurred while sending to the backend” 时,可能是你的 SQL 参数超过了 32767

一、现象:一个看似“网络”的异常

生产日志里突然冒出:复制

org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 34524

第一反应:
“网断了?连接池炸了?数据库挂了?”
结果 DBA 说数据库一切正常,别的业务也稳如老狗。于是开始漫长的“甩锅”之旅……


二、定位:34524 到底是个啥?

把异常栈翻到底,发现关键行:

at org.postgresql.core.PGStream.sendInteger2(PGStream.java:347)

PostgreSQL JDBC 驱动在组装Parse报文时,需要把参数个数写成 2 字节。
34524 > 32767(0x7FFF),直接越界,驱动抛错。
所以,这不是网络 I/O,而是协议层面的“参数超限”。


三、复现:一条 SQL 如何把参数干到 3W+

简化后的伪代码:

List<String> teams = dealerTeamService.selectAll(); // 1,800+ Map<String, Object> param = new HashMap<>(); param.put("dataDate", dataDate); param.put("teams", teams); // 1,800 个字符串 return mapper.queryWaitDeal(param);

对应的 XML:

<select id="queryWaitDeal" resultType="xxx"> SELECT 'survey' AS stage, 1 AS orderId, COALESCE(SUM(wait_cnt), 0) AS waitCnt FROM t_wait_deal WHERE data_date = #{dataDate} AND (dealer_id::text||','||dealer_team_id::text) = ANY <foreach collection="teams" item="t" open="ARRAY[" separator="," close="]"> #{t} </foreach> UNION ALL <!-- 还有 3 个 UNION,每个都 copy 一遍 teams --> </select>

1 800 × 4 条 UNION × 3 天批次 ≈ 34 000 个参数,
完美踩雷。


四、协议天花板:32767 的由来

PostgreSQL Frontend/Backend Protocol 文档里写得明明白白:

Parse (F) Int32 length String statementName String query Int16 number of parameter types (→ 2 字节) ...

JDBC 驱动只是忠实实现,想改协议?先 fork PG 源码


五、解法:参数瘦身三板斧

方案思路代码量级推荐指数
1. 临时表/VALUES 表COPY团队列表到临时表,SQL 里直接JOIN中等★★★★☆
2. 分批查询内存拆队,每批 1k,结果归并★★★★★
3. 服务端数组类型Array[text]换成int[],一条= ANY(?::int[])即可需 DBA 配合★★★☆☆

临时表演示:

sql

-- 会话级临时表,自动回收 CREATE TEMP TABLE tmp_team ON COMMIT DROP AS SELECT unnest(?::text[]) AS team_id; SELECT ... FROM t_wait_deal w JOIN tmp_team t ON (w.dealer_id||','||w.dealer_team_id) = t.team_id;

Java 端只需传1 个 java.sql.Array,参数个数瞬间降到 3 个。

分批演示:

List<List<String>> partitions = Lists.partition(allTeams, 800); return partitions.stream() .map(p -> mapper.queryWaitDeal(dataDate, p)) .reduce(this::merge) .orElse(Collections.emptyList());

六、踩坑小结

  1. 看到“An I/O error occurred while sending to the backend”先别急着重启,
    Caused by翻到底,关键字“out-of-range integer as a 2-byte value”直指参数过多。

  2. MyBatis 的<foreach>爽归爽,集合 size 超过 1k 就要警惕

  3. 架构评审时,把“列表查询”当潜在 SQL 炸弹,提前留好分批/临时表口子。

  4. 32767 是硬天花板,任何 ORM、任何驱动都绕不过去


七、一行代码应急兜底

if (teams.size() > 1000) { throw new BizException("一次最多选择 1000 个团队,请缩小范围"); }

先保命,再优化。


八、参考

  • PostgreSQL Protocol 3.0 – Frontend/Backend Protocol

  • PostgreSQL JDBC Driver –PGStream.javahistory #2471

  • MyBatis Foreach 陷阱 – MyBatis Documentation

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/23 17:47:00

【浏览器】页面加载原理详解

目录 概述浏览器架构基础页面加载完整流程HTML解析与DOM构建CSS解析与样式计算JavaScript执行机制渲染树构建与布局绘制与合成性能优化实践HTTP/3与QUIC协议详解Service Worker详解浏览器安全机制浏览器缓存机制详解JavaScript内存管理首屏渲染指标详解浏览器调试技巧移动端浏…

作者头像 李华
网站建设 2026/4/30 21:32:21

大模型Token揭秘:文字处理的关键,优化Prompt设计,降低使用成本!

简介 文章以生活化方式解释了大模型中的Token概念。Token是大模型理解和生成文字的最小单位&#xff0c;类似于人脑处理词语的方式。分词器将文本切分为Token&#xff0c;不同模型的分词方式可能因训练数据差异而不同。Token数量直接影响计算成本&#xff0c;因此大模型通常按T…

作者头像 李华
网站建设 2026/4/18 8:32:52

AI 插件供应链投毒复现:受害者加载被篡改插件导致 RCE 的实战分析

文章目录 一、漏洞背景二、实验环境准备三、靶场核心代码实现3.1 核心功能文件&#xff08;node_loader.py&#xff09;3.2 恶意投毒文件&#xff08;custom_nodes/malicious_node.py&#xff09; 四、实验执行步骤与结果4.1 实验执行流程4.2 实验结果输出 五、漏洞总结与安全建…

作者头像 李华
网站建设 2026/4/22 14:11:17

log-lottery终极实战:零基础构建企业级3D抽奖系统完整教程

log-lottery终极实战&#xff1a;零基础构建企业级3D抽奖系统完整教程 【免费下载链接】log-lottery &#x1f388;&#x1f388;&#x1f388;&#x1f388;年会抽奖程序&#xff0c;threejsvue3 3D球体动态抽奖应用。 项目地址: https://gitcode.com/gh_mirrors/lo/log-lot…

作者头像 李华
网站建设 2026/5/1 7:16:56

Workrave完整指南:终极RSI预防解决方案

Workrave完整指南&#xff1a;终极RSI预防解决方案 【免费下载链接】workrave Workrave is a program that assists in the recovery and prevention of Repetitive Strain Injury (RSI). The program frequently alerts you to take micro-pauses, rest breaks and restricts …

作者头像 李华
网站建设 2026/4/29 19:33:55

转行网安无方向?2025 最新规划(含 AI 安全 / 合规赛道),少踩坑

前言 前段时间&#xff0c;知名机构麦可思研究院发布了 《2022年中国本科生就业报告》&#xff0c;其中详细列出近五年的本科绿牌专业&#xff0c;其中&#xff0c;信息安全位列第一。 网络安全前景 对于网络安全的发展与就业前景&#xff0c;想必无需我多言&#xff0c;作为…

作者头像 李华