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

相关文章

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

SQL server数据库如何下载和安装

《SQLserver数据库如何下载和安装》本文指导如何下载安装SQLServer2022评估版及SSMS工具,涵盖安装配置、连接字符串设置、C#连接数据库方法和安全注意事项,如混合验证、参数化查... 目录第一步:打开官网下载对应文件第二步:程序安装配置第三部:安装工具SQL Server Manageme

C#连接SQL server数据库命令的基本步骤

《C#连接SQLserver数据库命令的基本步骤》文章讲解了连接SQLServer数据库的步骤,包括引入命名空间、构建连接字符串、使用SqlConnection和SqlCommand执行SQL操作,... 目录建议配合使用:如何下载和安装SQL server数据库-CSDN博客1. 引入必要的命名空间2.

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL 多列 IN 查询之语法、性能与实战技巧(最新整理)

《MySQL多列IN查询之语法、性能与实战技巧(最新整理)》本文详解MySQL多列IN查询,对比传统OR写法,强调其简洁高效,适合批量匹配复合键,通过联合索引、分批次优化提升性能,兼容多种数据库... 目录一、基础语法:多列 IN 的两种写法1. 直接值列表2. 子查询二、对比传统 OR 的写法三、性能分析

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Spring Boot spring-boot-maven-plugin 参数配置详解(最新推荐)

《SpringBootspring-boot-maven-plugin参数配置详解(最新推荐)》文章介绍了SpringBootMaven插件的5个核心目标(repackage、run、start... 目录一 spring-boot-maven-plugin 插件的5个Goals二 应用场景1 重新打包应用

浅谈mysql的not exists走不走索引

《浅谈mysql的notexists走不走索引》在MySQL中,​NOTEXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引,下面就来介绍一下mysql的notexists走不走索... 在mysql中,​NOT EXISTS子句是否使用索引取决于子查询中关联字段是否建立了合适的索引。以下

Android kotlin中 Channel 和 Flow 的区别和选择使用场景分析

《Androidkotlin中Channel和Flow的区别和选择使用场景分析》Kotlin协程中,Flow是冷数据流,按需触发,适合响应式数据处理;Channel是热数据流,持续发送,支持... 目录一、基本概念界定FlowChannel二、核心特性对比数据生产触发条件生产与消费的关系背压处理机制生命周期

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys