我正尝试使用Postgres JDBC驱动程序从一个表中查询数据,其中每行最多可以达到大约50MB。不幸的是,如果没有任何内存限制,Postgres驱动程序可能会使用太多内存并导致OOMs(即使使用非常健康的Xmx),因为它在本地缓冲了太多数据。
我试着限制驱动程序使用更少的内存,例如1GB,并告诉它缓冲区也更少。由于没有一行大于50MB,这应该工作正常,但不幸的是,我现在得到异常抛出的Postgres驱动程序本身。异常是因为它试图分配更多的内存比我配置它。
如果使用此配置:
"jdbc:postgresql://localhost/dbname?maxResultBuffer=1G&adaptiveFetch=true&adaptiveFetchMaximum=2&defaultRowFetchSize=1"
在PGStream
中,我将在此处抛出一个异常
if (resultBufferByteCount > maxResultBuffer) {
throw new PSQLException(GT.tr(
"Result set exceeded maxResultBuffer limit. Received: {0}; Current limit: {1}",
String.valueOf(resultBufferByteCount), String.valueOf(maxResultBuffer)),PSQLState.COMMUNICATION_ERROR);
}
如果在此处设置断点,则可以看到:
value = 41155480
resultBufferByteCount = 1021091718
maxResultBuffer = 1000000000
这表明它很好地获取了配置。我还检查了它,以确保它获取了获取大小配置,它确实如此。
还有其他的配置我错过了吗?显然Postgres驱动程序正在阅读比我允许的更多的行。
谢谢
(postgreqsl 42.5.1,java 17.0.5,hikaricp 5.0.1,最大连接数为1)
1条答案
按热度按时间ulmd4ohb1#
自适应缓冲区,如setFetchSize,只有在自动提交关闭时才起作用。如果自动提交打开,则它们会被默默忽略。我不知道是否有办法通过jdbc连接字符串关闭自动提交,我还没有找到。