PostgreSQL(十二)报错:Tried to send an out-of-range integer as a 2-byte value: 51000
目录
- 一、报错场景
- 二、源码分析
- 三、实际原因(更加复杂)
- 四、解决思路
一、报错场景
今天写了一个历史数据处理程序,在开发环境、测试环境都可以正常执行,但是放到生产环境上就不行,报了一个这样的错误:
- org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
意思大概是:当把数据发送给后端的时候,出现了一个 I/O 异常。
完整报错截图如下:
顺着日志中异常栈信息往下看,可以看到下面有一处具体的报错原因:
- Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 51000
意思大概是:出现了一个IO异常,尝试发送一个二进制 int 类型数值时,当前数值超出了大小限制:5100
Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 51000at org.postgresql.core.PGStream.sendInteger2(PGStream.java:359)at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1604)at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1929)at org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1487)at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:347)... 140 common frames omitted
二、源码分析
我们根据报错提示,找到源码对应的位置,该源码位于 postgresql 依赖中,Maven坐标如下:
<!--postgresql 数据库驱动依赖 -->
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.6.0</version><scope>runtime</scope>
</dependency>
源码位置如下:
可以看到这里有一个大小限制,Short.MAX_VALUE 对应的就是 Short 类型的最大值,为 32767。也就是说,在 PostgreSQL 中,如果参数的数量超过 32767 之后,就会抛出 Tried to send an out-of-range integer 这个异常。
三、实际原因(更加复杂)
道理都懂,但是细想的话还是有以下两个问题:
- 我在代码中明明根据入参按照 1000 分页处理的,没有超出 32767,为什么还会报这个错?
- 报错信息中的 51000 又是哪来的?
于是我们继续根据上面的异常栈信息进行排查,针对第2层栈信息在本地打断点调试。
Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 51000at org.postgresql.core.PGStream.sendInteger2(PGStream.java:359)at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1604)at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1929)at org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1487)at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:347)... 140 common frames omitted
首先找到第二层栈信息对应的源码位置,并在本地进行debug:
这里我本地调试的时候,是传了 11 个参数,但是在第二层断点中入参却变成了 352 个,这是为什么呢?
不要慌,其实这里的 queryUtf8 变量中存储的就是我们的 SQL 了,我们直接查看下这个变量的字符串即可:
终于,找到罪魁祸首了,由于项目中集成了 ShrdingJDBC,导致执行 SQL 的时候会自动拼接分表 SQL 并进行 UNION ALL,导致入参个数猛增几十倍。所以:
- 开发环境中,分表是 202110~202405,32张表 × 11个入参 = 352 个总入参。
- 生产环境中,分表是 202110~202512,51张表 × 1000个入参 = 51000 个总入参。
51000 远远超出 32767 的限制,所以抛出 IO 异常。
四、解决思路
可以根据以下两种情况,分别进行解决:
- 如果没有使用 ShardingJDBC 进行分表:建议分页处理。
- 如果已经使用 ShardingJDBC 进行分表:在单个SQL入参不超过 32767 的情况下,一方面可以将分片键加入参数中;另一方面可以再进一步分页,细化分页颗粒度。
整理完毕,完结撒花~🌻
相关文章:
PostgreSQL(十二)报错:Tried to send an out-of-range integer as a 2-byte value: 51000
目录 一、报错场景二、源码分析三、实际原因(更加复杂)四、解决思路 一、报错场景 今天写了一个历史数据处理程序,在开发环境、测试环境都可以正常执行,但是放到生产环境上就不行,报了一个这样的错误: or…...
Linux守护进程
进程组和会话在 UNIX 系统中是非常重要的概念,特别是在进行作业控制和终端会话管理时。下面是关于进程组和会话的详细解释: 进程组(Process Group) 定义与作用: 进程组是一个或多个进程的集合,这些进程通常…...
HarmonyOS 应用开发——入门
首先当然是华为的官方文档了,要认真学习: https://developer.huawei.com/consumer/cn/doc/harmonyos-guides-V2/start-overview-0000001478061421-V2 不想花时间看,可以看我下面总结的干货,哈哈 第一个问题:stage架构和fa架构的区…...
开源免费的发票识别OCR应用:Invoice
Invoice:轻松识别,发票电子化扫描烦恼消- 精选真开源,释放新价值。 概览 Invoice 是github社区上一个采用开源许可协议发布的增值税发票光学字符识别(OCR)解决方案项目。该项目不仅集成了预训练的高级模型,…...
关于Docker alpine
1.拉取alpine镜像 docker pull alpine 2.运行镜像成为容器 docker run -it --rm alpine sh (--rm标志确保容器在退出时被自动删除。) 3.容器建立后,运行 docker exec -it <container_id> sh 4.进入容器里的 alpine环境 ①.配置安装源 cat >/etc…...
【Elasticsearch运维系列】Elasticsearch7.12.1启动指定版本JDK:你学废了吗?
一、背景 一套生ES集群,版本为7.12.1,近期频繁告警,频繁出现索引分片异常,索引状态异常,导致应用无法正常写入ES,另外,也经常出现节点掉问题。通过分析相关ES日志,显示和当前JAVA G…...
思通数科大模型在智能数据查询系统中的深度应用:销售数据分析的革新
在企业决策支持系统中,销售数据分析占据着举足轻重的地位。思通数科的大模型技术,结合自然语言处理(NLP)和机器学习,为智能数据查询系统提供了强大的分析能力。本文将详细描述思通数科大模型在销售数据分析中的应用&am…...
上位机图像处理和嵌入式模块部署(树莓派4b和qt应用全屏占有)
【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 我们都知道,嵌入式应用一般都是为了某一个特定应用而存在的。也就是说,和pc不同,这个嵌入式板子一般都是为了解…...
QT:QT窗口(一)
文章目录 菜单栏创建菜单栏在菜单栏中添加菜单创建菜单项添加分割线 工具栏创建工具栏设置停靠位置创建工具栏的同时指定停靠位置使用QToolBar类提供的setAllowedAreas函数来设置停靠位置 设置浮动属性设置移动属性 状态栏状态栏的创建在状态栏中显示实时消息在状态栏中显示永久…...
matlab例题大全
1.第1章 MATLAB系统环境 1.1 注:plot函数为画图函数。例plot(x1,y1,:,x2,y2,*); 1.2 注:root为求根函数。p为方程变量前面系数矩阵。 1.3 注: 2*x3y-1*z 2; 8*x2*y3*z 4; 45*x3*y9*z 23 求:x,y,z的…...
SwiGLU激活函数
SwiGLU激活函数已经成为LLM的标配了。它是GLU的变体,公式如下: SwiGLU ( x , W , V , b , c , β ) Swish β ( x W b ) ⊗ ( x V c ) \operatorname{SwiGLU}(x, W, V, b, c, \beta)\operatorname{Swish}_\beta(x Wb) \otimes(x Vc) SwiGLU(x,…...
MySQL慢查询优化
当需要优化MySQL的慢查询时,通常需要结合多个方面进行分析和优化,包括索引优化、SQL语句重构、数据库结构调整等。下面,我将通过一个例子来说明如何优化MySQL的慢查询,包括多表关联和条件查询。 假设我们有一个简化的电子商务系统…...
开源数据可视化大屏对接表单数据实践!
如果你需要一个表单系统,进行数据收集;可以使用tduck填鸭进行私有化部署,进行表单制作,完成数据收集。 在实际业务中,往往需要将收集的数据进行展示或分析;此时就可以使用表单数据推送到TReport中…...
08.图形化界面字体问题处理
图形化界面字体问题处理 发现图形存在乱码,不显示文字 zabbix服务器的字符集所在的路径下: /usr/share/zabbix/assets/fonts 将本地windows系统的字体进行上传,选择一个自己喜欢的字体 上传到系统路径下并且直接覆盖掉 回到web浏览器界面…...
【代码随想录算法训练营第37期 第二天 | LeetCode977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II】
代码随想录算法训练营第37期 第二天 | LeetCode977.有序数组的平方、209.长度最小的子数组、59.螺旋矩阵II 一、977.有序数组的平方 解题代码C: class Solution { public:vector<int> sortedSquares(vector<int>& nums) {int len nums.size();fo…...
Java:Servlet详解
目录 一、什么是Servlet 二、Servlet原理 Servlet的生命周期 三、 Servlet注释 WebServlet 一、什么是Servlet Servlet是JavaWeb开发的一种技术,Servlet程序需要部署在Servlet容器(服务端)中才能运行,常见的Servlet容器有Tom…...
Oracle存储过程怎么定义类并继承
在Oracle数据库中,存储过程(Stored Procedure)是用于执行特定功能的预编译的SQL代码块。然而,Oracle的存储过程并不直接支持面向对象的编程概念,如类(Class)和继承(Inheritance&…...
14_Scala面向对象编程_属性
文章目录 属性1.类中属性声明2.系统默认赋值3.BeanProperty4.整体代码如下 属性 1.类中属性声明 // 1.给Scala声明属性;var name :String "zhangsan"val age :Int 302.系统默认赋值 scala由于初始化变量必须赋值,为了解决此问题可以采…...
什么是网页反作弊
在搜索引擎技术中,网页反作弊是指一种防止网页排名被恶意操纵的技术。搜索引擎会根据特定的算法来评估网页的相关性和质量,以决定其在搜索结果中的排名。然而,有些人可能会尝试通过各种不正当的手段来提高自己网页的排名,这被称为…...
MAVEN打包JAR启动执行manifest
当您使用Maven进行项目打包,特别是需要创建一个可执行的JAR文件时,确保JAR文件的MANIFEST.MF中包含正确的Main-Class属性是非常重要的。这个属性告诉Java运行时环境哪个类包含main方法,作为应用程序的入口点。 如果您发现生成的JAR文件不包含…...
Phi-3-mini-128k-instruct创意写作效果集锦:技术博客、邮件、周报一键生成
Phi-3-mini-128k-instruct创意写作效果集锦:技术博客、邮件、周报一键生成 每次打开文档,面对空白的页面,你是不是也有过那种“万事开头难”的感觉?特别是写技术博客、整理会议邮件、或者汇总项目周报的时候,明明脑子…...
GD32F30x串口DMA+空闲中断接收不定长数据,一个LED控制项目带你搞懂
GD32F30x串口DMA空闲中断实战:从零构建LED智能控制系统 在嵌入式开发中,串口通信就像设备的"嘴巴"和"耳朵",而DMA技术则是解放CPU的"隐形助手"。想象一下这样的场景:你需要通过手机APP远程控制实验…...
FedProto:跨异构客户端的原型联邦学习实践指南
1. 从零理解FedProto的核心思想 第一次听说FedProto时,我正被一个医疗影像分析项目搞得焦头烂额。五家医院的数据就像五个方言区——同样的病症在CT影像上呈现的特征分布天差地别。传统联邦学习就像让这些医院用各自的方言写报告,再强行翻译成标准语&…...
哔哩下载姬DownKyi实用指南:从新手到高手的进阶之路
哔哩下载姬DownKyi实用指南:从新手到高手的进阶之路 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等…...
SEO排名专家的工作内容是什么_如何成为一名出色的SEO排名专家
<h2>SEO排名专家的工作内容是什么</h2> <p>SEO排名专家,全称搜索引擎优化专家,是一类致力于提升网站在搜索引擎中排名的专业人士。他们的工作内容涵盖了广泛的技术和策略,旨在让网站在搜索结果中获得更高的曝光率ÿ…...
避开这些坑!医疗内窥镜Zemax优化时的高温灭菌与弯曲成像难题解决指南
医疗内窥镜光学系统设计实战:高温灭菌与弯曲成像的Zemax解决方案 在微创手术和工业检测领域,直径仅2.8mm的医疗内窥镜需要同时满足140广角视场、F2.0大光圈和10μm高分辨率的要求。更严峻的挑战来自使用环境——必须耐受135℃高温蒸汽灭菌,并…...
Livox_ros_driver vs driver2:消息类型详解与ROS生态兼容性避坑指南
Livox_ros_driver与driver2深度对比:消息架构解析与ROS生态适配实战 当Livox发布HAP等新一代激光雷达时,技术团队常面临驱动版本选择的困境。livox_ros_driver与livox_ros_driver2看似只是版本迭代,实则反映了ROS生态中传感器接口标准化的深层…...
IP5306电源芯片的‘怪脾气’:实测开机半分钟就休眠?手把手教你两个硬件调试技巧
IP5306电源芯片实战调试:破解自动休眠难题的硬件级方案 实验室里,示波器屏幕上那条本该稳定的电压线突然跌落至零,系统再次陷入休眠——这已经是今天第七次重现IP5306芯片的"怪脾气"。作为一款广泛应用于移动电源的高集成度SOC&…...
老牌CMS的隐痛:从DedeCMS漏洞看开源系统会员模块的安全设计误区
DedeCMS会员模块漏洞剖析:开源系统安全设计的深层反思 当一款拥有百万级安装量的老牌CMS系统曝出前台任意密码修改漏洞时,我们看到的不仅是一个具体的技术缺陷,更是开源项目在安全架构设计上的系统性隐忧。2018年那场影响广泛的DedeCMS漏洞事…...
5步告别Windows卡顿:Win11Debloat系统优化工具让电脑性能提升51%的实战指南
5步告别Windows卡顿:Win11Debloat系统优化工具让电脑性能提升51%的实战指南 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各…...
