JDBC-Driver、PostgreSQL的SQL语句参数上限错误分析及解决办法(源码)

本文主要是介绍JDBC-Driver、PostgreSQL的SQL语句参数上限错误分析及解决办法(源码),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

JDBC-Driver、PostgreSQL的SQL语句参数上限错误分析及解决办法(源码)

Mybatis + PostgreSQL-JDBC-Driver 42.1.4批量插入24178条数据(每条30字段).报如下错误:

pSQL 9.6

Cause: org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
; SQL []; An I/O error occurred while sending to the backend.; nested exception is org.postgresql.util.PSQLException: An I/O error occurred while sending to the backend.
Tried to send an out-of-range integer as a 2-byte value: 647430

没想到批量插入的顶峰在JDBC-Driver这里首先出现天花板.

原因:

  • 这里是JDBC-Driver 一条SQL**参数数量达到了上限,幂增操作的参数=记录数(行)插入的字段数(列)*.
  • JDBC-Driver 支持的参数数量跟版本(x.y.z)和类型(xx数据库)有关.

解决思路:

分割成小段提交.

解决办法:

@Service
public class ChPeriodicalThesisService {@Autowiredprivate ChPeriodicalThesisMapper thesisDao;//其他CRUD.../*** .* TODO  批量插入* @param thesisList* @return* @throws Exception*/public int insertList(List<ChPeriodicalThesis> thesisList) throws Exception {return thesisDao.insertList(thesisList);}/*** .* TODO 递归:分割长List为 subNum/段。* @param thesisList 论文list(总)* @param subNum 每段长度 (最小1)* @return* @throws Exception*/private int recurSub(List<ChPeriodicalThesis> thesisList,int subNum) throws Exception{//参数合法性判断:if(thesisList.isEmpty()) return 0;if(subNum<1) return 0;//大于subNum,进入分割if(thesisList.size() > subNum) {// && !(thesisList.isEmpty())//将前subNum分出来,直接插入到数据库。List<ChPeriodicalThesis> toInsert = thesisList.subList(0, subNum);//将subNum至最后 (剩余部分) 继续进行递归分割List<ChPeriodicalThesis> toRecurSub = thesisList.subList(subNum, thesisList.size());//将前subNum分出来,直接插入到数据库 && 将subNum至最后 (剩余部分) 继续进行递归分割 。统计数量return insertList(toInsert) + recurSub(toRecurSub,subNum);//少于subNum,直接插入数据库 (递归出口)}else {//插入到数据库。统计数量return insertList(thesisList);}}/*** .* TODO 将数据流读取并批量插入* @param in* @return* @throws Exception*/public int readStreamAndInsertList(InputStream in) throws Exception {FileUtil fileUtil = new FileUtil();List<ChPeriodicalThesis> thesisList = fileUtil.importFileOfChPeriodicalThesis(in);//每1500为一段 插入return recurSub(thesisList,1500);}
}

源码: 欢迎交流.

https://github.com/timo1160139211/trans

参考资料:

https://stackoverflow.com/questions/20878854/postgresql-exception-org-postgresql-util-psqlexception-an-i-o-error-occured-w

效果:
这里写图片描述

这里写图片描述

这篇关于JDBC-Driver、PostgreSQL的SQL语句参数上限错误分析及解决办法(源码)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/889632

相关文章

MySQL的JDBC编程详解

《MySQL的JDBC编程详解》:本文主要介绍MySQL的JDBC编程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、前置知识1. 引入依赖2. 认识 url二、JDBC 操作流程1. JDBC 的写操作2. JDBC 的读操作总结前言本文介绍了mysq

java.sql.SQLTransientConnectionException连接超时异常原因及解决方案

《java.sql.SQLTransientConnectionException连接超时异常原因及解决方案》:本文主要介绍java.sql.SQLTransientConnectionExcep... 目录一、引言二、异常信息分析三、可能的原因3.1 连接池配置不合理3.2 数据库负载过高3.3 连接泄漏

javacv依赖太大导致jar包也大的解决办法

《javacv依赖太大导致jar包也大的解决办法》随着项目的复杂度和依赖关系的增加,打包后的JAR包可能会变得很大,:本文主要介绍javacv依赖太大导致jar包也大的解决办法,文中通过代码介绍的... 目录前言1.检查依赖2.更改依赖3.检查副依赖总结 前言最近在写项目时,用到了Javacv里的获取视频

Linux下MySQL数据库定时备份脚本与Crontab配置教学

《Linux下MySQL数据库定时备份脚本与Crontab配置教学》在生产环境中,数据库是核心资产之一,定期备份数据库可以有效防止意外数据丢失,本文将分享一份MySQL定时备份脚本,并讲解如何通过cr... 目录备份脚本详解脚本功能说明授权与可执行权限使用 Crontab 定时执行编辑 Crontab添加定

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

HTTP 与 SpringBoot 参数提交与接收协议方式

《HTTP与SpringBoot参数提交与接收协议方式》HTTP参数提交方式包括URL查询、表单、JSON/XML、路径变量、头部、Cookie、GraphQL、WebSocket和SSE,依据... 目录HTTP 协议支持多种参数提交方式,主要取决于请求方法(Method)和内容类型(Content-Ty

深度解析Java @Serial 注解及常见错误案例

《深度解析Java@Serial注解及常见错误案例》Java14引入@Serial注解,用于编译时校验序列化成员,替代传统方式解决运行时错误,适用于Serializable类的方法/字段,需注意签... 目录Java @Serial 注解深度解析1. 注解本质2. 核心作用(1) 主要用途(2) 适用位置3

Debian 13升级后网络转发等功能异常怎么办? 并非错误而是管理机制变更

《Debian13升级后网络转发等功能异常怎么办?并非错误而是管理机制变更》很多朋友反馈,更新到Debian13后网络转发等功能异常,这并非BUG而是Debian13Trixie调整... 日前 Debian 13 Trixie 发布后已经有众多网友升级到新版本,只不过升级后发现某些功能存在异常,例如网络转

MySQL中On duplicate key update的实现示例

《MySQL中Onduplicatekeyupdate的实现示例》ONDUPLICATEKEYUPDATE是一种MySQL的语法,它在插入新数据时,如果遇到唯一键冲突,则会执行更新操作,而不是抛... 目录1/ ON DUPLICATE KEY UPDATE的简介2/ ON DUPLICATE KEY UP

MySQL分库分表的实践示例

《MySQL分库分表的实践示例》MySQL分库分表适用于数据量大或并发压力高的场景,核心技术包括水平/垂直分片和分库,需应对分布式事务、跨库查询等挑战,通过中间件和解决方案实现,最佳实践为合理策略、备... 目录一、分库分表的触发条件1.1 数据量阈值1.2 并发压力二、分库分表的核心技术模块2.1 水平分