java.io.IOException: Tried to send an out-of-range integer as a 2-byte value

本文讨论了在使用 PostgreSQL JDBC 驱动时,预设语句参数数量受限于客户端的 2 字节整数限制的问题。通过将参数列表分割成每批 50,000 个参数,可以有效解决此问题,避免出现超出参数限制的异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

The newest feature in the software I’m developing at Just Software is a workstream, which is our aggregate name for microblog and activity stream functionality. Since we’re using a relational DB we’ve modeled this module in the way that every workstream message is attached to a user’s stream in a simple m:n relation manner. To reduce the number of INSERT statements the list of streams is assembled in the business service and then handed over to the database service which does sth. like this:

INSERT INTO workstream(msgid, userid) VALUES(5, 1), VALUES(5, 2), ...;

This however can result in a huge amount of VALUES(…) parameters when the platform has many users. It didn’t occur as a problem to me when implementing it; PostgreSQL can handle large data, no? Well, it’s at least limited. When you use a JDBC prepared statement then the number of parameters has a hard limit: 32767. If you don’t obey this limit you’ll see something like this:

java.io.IOException: Tried to send an out-of-range integer as a 2-byte value: 40000

Not a very concrete message, right? When I first saw this exception I was kind of baffled and disaffected. But after narrowing down the problem in a debug session and looking at the PostgreSQL JDBC driver’s source code the cause was obvious: the PostgreSQL client/backend protocol dictates that the number of parameters be send from the client to the Postgres backend as a 2 byte integer (aaah, now the above message actually makes sense). You’ll find details of the protocol here if you’re brave (my 2-byte friend is defined in the Parse message).

All right, got the bugger, what’s the solution now? Easy: Just split the parameter list up into chunks of say 30.000 parameters per INSERT statement.


----------------------------------

问题:pg的jdbc driver对prepared Statement的参数 set的时候,client端的一个发送大小限制在2-byte。

解决方法:目前的版本最大限制50132,建议每次分割在50,000个参数去执行。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值