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

相关文章

使用shardingsphere实现mysql数据库分片方式

《使用shardingsphere实现mysql数据库分片方式》本文介绍如何使用ShardingSphere-JDBC在SpringBoot中实现MySQL水平分库,涵盖分片策略、路由算法及零侵入配置... 目录一、ShardingSphere 简介1.1 对比1.2 核心概念1.3 Sharding-Sp

MySQL 表空却 ibd 文件过大的问题及解决方法

《MySQL表空却ibd文件过大的问题及解决方法》本文给大家介绍MySQL表空却ibd文件过大的问题及解决方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考... 目录一、问题背景:表空却 “吃满” 磁盘的怪事二、问题复现:一步步编程还原异常场景1. 准备测试源表与数据

Mac电脑如何通过 IntelliJ IDEA 远程连接 MySQL

《Mac电脑如何通过IntelliJIDEA远程连接MySQL》本文详解Mac通过IntelliJIDEA远程连接MySQL的步骤,本文通过图文并茂的形式给大家介绍的非常详细,感兴趣的朋友跟... 目录MAC电脑通过 IntelliJ IDEA 远程连接 mysql 的详细教程一、前缀条件确认二、打开 ID

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

python中的显式声明类型参数使用方式

《python中的显式声明类型参数使用方式》文章探讨了Python3.10+版本中类型注解的使用,指出FastAPI官方示例强调显式声明参数类型,通过|操作符替代Union/Optional,可提升代... 目录背景python函数显式声明的类型汇总基本类型集合类型Optional and Union(py

MySQL的配置文件详解及实例代码

《MySQL的配置文件详解及实例代码》MySQL的配置文件是服务器运行的重要组成部分,用于设置服务器操作的各种参数,下面:本文主要介绍MySQL配置文件的相关资料,文中通过代码介绍的非常详细,需要... 目录前言一、配置文件结构1.[mysqld]2.[client]3.[mysql]4.[mysqldum

MySQL中查询和展示LONGBLOB类型数据的技巧总结

《MySQL中查询和展示LONGBLOB类型数据的技巧总结》在MySQL中LONGBLOB是一种二进制大对象(BLOB)数据类型,用于存储大量的二进制数据,:本文主要介绍MySQL中查询和展示LO... 目录前言1. 查询 LONGBLOB 数据的大小2. 查询并展示 LONGBLOB 数据2.1 转换为十

SpringBoot3匹配Mybatis3的错误与解决方案

《SpringBoot3匹配Mybatis3的错误与解决方案》文章指出SpringBoot3与MyBatis3兼容性问题,因未更新MyBatis-Plus依赖至SpringBoot3专用坐标,导致类冲... 目录SpringBoot3匹配MyBATis3的错误与解决mybatis在SpringBoot3如果

Go语言连接MySQL数据库执行基本的增删改查

《Go语言连接MySQL数据库执行基本的增删改查》在后端开发中,MySQL是最常用的关系型数据库之一,本文主要为大家详细介绍了如何使用Go连接MySQL数据库并执行基本的增删改查吧... 目录Go语言连接mysql数据库准备工作安装 MySQL 驱动代码实现运行结果注意事项Go语言执行基本的增删改查准备工作

MySQL按时间维度对亿级数据表进行平滑分表

《MySQL按时间维度对亿级数据表进行平滑分表》本文将以一个真实的4亿数据表分表案例为基础,详细介绍如何在不影响线上业务的情况下,完成按时间维度分表的完整过程,感兴趣的小伙伴可以了解一下... 目录引言一、为什么我们需要分表1.1 单表数据量过大的问题1.2 分表方案选型二、分表前的准备工作2.1 数据评估