PostgreSQL异常:An IO error occurred while sending to the backend

Pgsql报错:PostgreSQL的SQL语句参数上限报错 一、报错信息 Mybatis + PostgreSQL-JDBC-Driver 42.1.4批量插入24178条数据(每条30字段).报如下错误: PgSQL 9.6 Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend. ; SQL []; An I/O error... 阅读详情

在这里插入图片描述

在使用PostgreSQL数据库批量写入数据的时候,遇到了一个问题,异常内容如下:

Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
报错内容
报错提示1
Caused by: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:336)
	at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:446)
	at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:370)
	at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:149)
	at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:138)
报错提示2
Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 1847252
	at org.postgresql.core.PGStream.sendInteger2(PGStream.java:252)
	at org.postgresql.core.v3.QueryExecutorImpl.sendParse(QueryExecutorImpl.java:1470)
	at org.postgresql.core.v3.QueryExecutorImpl.sendOneQuery(QueryExecutorImpl.java:1793)
	at org.postgresql.core.v3.QueryExecutorImpl.sendQuery(QueryExecutorImpl.java:1356)
	at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:301)
	... 117 common frames omitted
问题分析

从首个错误信息中可以看出,在PostgreSQL运行SQL语句时遭遇了输入/输出(I/O)异常,这意味着所执行的SQL语句存在某种问题或数据库文件系统有潜在故障。

而第二条错误信息则揭示,PostgreSQL在向客户端传输数据时,数据量超过了预设的限制。这通常表明,执行中的SQL查询结果过于庞大,超出了系统默认的传输容量,可能是因为查询返回了过多的数据行或单行数据包含大量信息所致。

查看源码
  /**
   * Sends a 2-byte integer (short) to the back end.
   *
   * @param val the integer to be sent
   * @throws IOException if an I/O error occurs or {@code val} cannot be encoded in 2 bytes
   */
  public void sendInteger2(int val) throws IOException {
    if (val < Short.MIN_VALUE || val > Short.MAX_VALUE) {
      throw new IOException("Tried to send an out-of-range integer as a 2-byte value: " + val);
    }

    int2Buf[0] = (byte) (val >>> 8);
    int2Buf[1] = (byte) val;
    pgOutput.write(int2Buf);
  }

sendInteger2方法的作用是将一个整型值转换成短整型的二进制表示,并通过输出流发送给后端。如果输入的值超出短整型的范围,或者在写入过程中出现I/O错误,则会抛出IOException。

在方法内部,首先进行了一次范围检查,确保传入的整数值在短整型(short)的表示范围内,即介于 Short.MIN_VALUE 和 Short.MAX_VALUE 之间。如果超出范围,会抛出一个 IOException,指明试图发送的值过大或过小,无法用两个字节表示。

上面的错误提示,能确定就是在这块抛出的了,接下来重点查看代码中批量写入数据的代码。

问题发现

拿到接口执行的SQL以后,发现是一个批量写入的SQL,执行语句特别长,在Navicat中执行就直接报错了;修改批量写入的数据条数,发现是可以正常执行的;

伪代码如下:

// 从一个响应中获取一个名为"list"的数据集合
List<CustomEntity> entityList = ExtractListFromResponse(response, "list");

// 使用一个数据访问层组件,将数据插入到数据库中的指定表中
DataMapper.persistResponseData(entityList, targetTableName);
问题解决
将大集合进行拆分
// 使用org.apache.commons.collections4提供的ListUtils工具类,将大集合按照每组1000条进行拆分
List<List<CustomEntity>> partition = ListUtils.partition(entityList,1000);
// 循环遍历拆分之后的集合,分批写入数据
for (List<CustomEntity> customEntityList : partition){
    // 使用一个数据访问层组件,将数据插入到数据库中的指定表中
    DataMapper.persistResponseData(customEntityList, targetTableName);
}
使用MybatisPlus的批量写入

请确保自己的项目当中使用了MybatisPlus

// 从一个响应中获取一个名为"list"的数据集合
List<CustomEntity> entityList = ExtractListFromResponse(response, "list");
// 使用MybatisPlus的批量写入,指定每批写入条数
customService.saveBatch(entityList,1000);
【PSQLException: An I/O error occurred while sending to the backend.】 在实际项目中,执行定时任务报错,使用的PG数据库,运行时报An I/O error occured while sending to the backend. Caused by: java.net.SocketTimeoutException: Read time out。如何解决? 阅读详情

相关推荐

【Druid最佳实践】Druid报An I/O error occurred while sending to the backend等相关问题总结

本文对Druid报An I/O error occurred while sending to the backend等相关问题进行全面总结 结合实际案例,由浅入深,一一举例如下可能原因: 1、网络连通问题:网络不通 2、数据传输超时:网络太慢、数据量太大,导致超过了写入或查询的超时时间 3、超时时间配置太短(本文重点)

搬砖工 2277

PostgreSQL的SQL语句参数上限 An I/O error occurred while sending to the backend

An I/O error occurred while sending to the backend.

qq_33732195的博客 5万+

学习笔记:CNN中模型复杂度

CNN有卷积层和全连接层构成。对于一个卷积层,设输入通道数未CinC_{in}Cin​,输出通道数未CoutC_{out}Cout​,卷积核kernel size为Kw×KhK_w\times K_hKw​×Kh​,输出的特征图尺寸是H×WH\times WH×W 。全连接层的输入通道数为NinN_{in}Nin​,输出通道数为NoutN_{out}Nout​. 时间复杂度 用每秒钟浮点数运算量衡量。 FLOPs指的是floating-point operations per second,每秒钟浮点数运算

keep用心的博客 623

成功解决 -- An I/O error occured while sending data to the backend.

文章目录问题描述历史经验排查步骤解决方法 问题描述 Oracle通过kettle工具同步数据到Gauss报IO错误。 历史经验 应用侧 获取连接后未及时关闭(DriverManager.gerConnection后未调用con.close),下次再使用连接时已被数据库侧清除,用户感知到IO错误。 使用kettle表输入/输出方式同步数据:原理是开启一个事务,一次执行1000个insert,效率低,占用网络资源多,频繁地连接和断开,就会出现网络压力太大导致断开的问题。 数据库侧 管理员通过

L小Ray想有腮 2万+

【测试】echo发送和接收TCP/UDP数据包|shell 发送TCP/UDP数据包

目录 通过/dev/tcp、/dev/udp shell给tcp或udp服务发送16进制报文指令 通过/dev/tcp、/dev/udp (https://blog.youkuaiyun.com/u010039418/article/details/86251470) 通过/dev/tcp、/dev/udp可以直接在shell脚本中发起tcp、udp连接,方便又高效,平时用于测试啥的还是挺方便的。 直接发送 格式 /dev/udp/ip/port 比如要向本地10001端口发送数据,可以使用 ec.

我的笔记本 1万+

Xshell 连接 VMware虚拟机操作 截图和使用

vmwareVMware总部位于美国加州帕洛阿尔托(Palo Alto),是全球云基础架构和移动商务解决方案厂商,提供基于VMware的解决方案,企业通过数据中心改造和公有云整合业务,借助企业安全转型维系客户信任,实现任意云端和设备上运行、管理、连接及保护任意应用Xshell(安全终端模拟软件)Xshell [1]是一个强大的安全终端模拟软件,它支持SSH1, SSH2, 以及Microsoft Windows 平台的TELNET 协议。

小 tom的博客 802
上一篇: Node.js的解释
下一篇: Redis 配置日志
普通网友
博客等级 码龄1年 6粉丝 69原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值