如何排查PostgreSQL批量插入数据时出现的错误?

2026-05-22 05:501阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计598个文字,预计阅读时间需要3分钟。

如何排查PostgreSQL批量插入数据时出现的错误?

在使用PostgreSQL程序批量插入数据时遇到错误,具体错误信息为:Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 43800。这个问题通常是因为在JDBC连接中使用了一个错误的或过时的PostgreSQL JDBC驱动程序版本导致的。以下是解决方法:

1. 更新PostgreSQL JDBC驱动程序到最新版本。

2.确保SQL语句没有问题,特别是对于大数据类型或超大数据值。

3.检查Navicat中使用的SQL语句是否正确。

如果上述步骤无法解决问题,可以尝试以下步骤:

- 使用PostgreSQL的客户端工具(如psql)手动执行SQL语句,确认SQL语句本身没有问题。

- 如果问题仍然存在,检查网络连接是否稳定,有时网络问题也可能导致这类错误。- 在JDBC连接字符串中添加参数来禁用某些功能,例如:`?useSSL=false&stringType=java.sql.Types.CHAR`。

这样可以帮助你定位和解决数据插入过程中的问题。

如何排查PostgreSQL批量插入数据时出现的错误?

postgresql

程序批量插入数据时报错,将sql在navicat执行又不报错。报错信息:Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 43800

查询资料参考资料发现postgreSQL JDBC驱动限定,client端的一个发送大小限制为2byte。
也就是批量插入的时候values里面的参数个数(行数*列数)不能超过32767。建议批量插入的时候设置为1000行左右提交一次。

引用:
这里举两个代表性栗子:
sql渣:

for i in (1-1000): start transaction; insert into table values (1); commit; end for

sql赞:

start transaction; for i in (1-1000): insert into table values (1); end for commit;

sql赞爆:

insert into table values (1)()...........()(1000);

首先,sql语法是我临时自创的,这个不是关键,关键在sql渣先生是1000个事务插1000行,日志flush1000次。sql赞先生是一个事务插1000行,事务日志flush1次。sql赞爆最nice。
这个例子我想表达的意思是如果你要用sql做一件事,那就要尽量让这件事占用的事务总时间最少。

第二个例子
sql渣:

update table where id > 0 and id < 1000000;

sql赞:

update table where id > 0 and id < 1000; update table where id >= 1000 and id < 2000; update table where id >= 2000 and id < 3000;

....
....
这个例子我想表达的意思是如果你要用sql做一件很大的事,那就尽量让大事化成很多小事。
两个例子好好体会下,一点不矛盾哦。补充一下,这里每个update都是单独事务

本文共计598个文字,预计阅读时间需要3分钟。

如何排查PostgreSQL批量插入数据时出现的错误?

在使用PostgreSQL程序批量插入数据时遇到错误,具体错误信息为:Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 43800。这个问题通常是因为在JDBC连接中使用了一个错误的或过时的PostgreSQL JDBC驱动程序版本导致的。以下是解决方法:

1. 更新PostgreSQL JDBC驱动程序到最新版本。

2.确保SQL语句没有问题,特别是对于大数据类型或超大数据值。

3.检查Navicat中使用的SQL语句是否正确。

如果上述步骤无法解决问题,可以尝试以下步骤:

- 使用PostgreSQL的客户端工具(如psql)手动执行SQL语句,确认SQL语句本身没有问题。

- 如果问题仍然存在,检查网络连接是否稳定,有时网络问题也可能导致这类错误。- 在JDBC连接字符串中添加参数来禁用某些功能,例如:`?useSSL=false&stringType=java.sql.Types.CHAR`。

这样可以帮助你定位和解决数据插入过程中的问题。

如何排查PostgreSQL批量插入数据时出现的错误?

postgresql

程序批量插入数据时报错,将sql在navicat执行又不报错。报错信息:Caused by: java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 43800

查询资料参考资料发现postgreSQL JDBC驱动限定,client端的一个发送大小限制为2byte。
也就是批量插入的时候values里面的参数个数(行数*列数)不能超过32767。建议批量插入的时候设置为1000行左右提交一次。

引用:
这里举两个代表性栗子:
sql渣:

for i in (1-1000): start transaction; insert into table values (1); commit; end for

sql赞:

start transaction; for i in (1-1000): insert into table values (1); end for commit;

sql赞爆:

insert into table values (1)()...........()(1000);

首先,sql语法是我临时自创的,这个不是关键,关键在sql渣先生是1000个事务插1000行,日志flush1000次。sql赞先生是一个事务插1000行,事务日志flush1次。sql赞爆最nice。
这个例子我想表达的意思是如果你要用sql做一件事,那就要尽量让这件事占用的事务总时间最少。

第二个例子
sql渣:

update table where id > 0 and id < 1000000;

sql赞:

update table where id > 0 and id < 1000; update table where id >= 1000 and id < 2000; update table where id >= 2000 and id < 3000;

....
....
这个例子我想表达的意思是如果你要用sql做一件很大的事,那就尽量让大事化成很多小事。
两个例子好好体会下,一点不矛盾哦。补充一下,这里每个update都是单独事务