JDBC executeBatch() 在 PostgreSQL 中无错误地挂起

JDBC executeBatch() hangs without error in PostgreSQL

我尝试在 table 中加载 200 列的 50000 行。我每 1000 行做 executeBatch()。我为此获得了锁定 table。相同的代码适用于 MS SQL 和 Oracle,但对于 postgresql 我遇到了这个问题。当我将 executeBatch 数字从 1000 减少到 75 时,一切正常。

配置文件中是否有任何参数 响应批处理缓冲区大小?

同样的问题http://www.postgresql.org/message-id/c44a1bc0-dcb1-4b57-8106-e50f9303b7d1@79g2000hsk.googlegroups.com

一般需要查找以下内容。

  1. 你真的能得到 table 的锁吗?
  2. 您还有其他 java 密码锁在等待吗?

一般来说,首先要检查的地方是 pg_stat_activity system 视图,它会向您显示正在执行的查询以及它是否处于活动状态、空闲状态、等待状态等。如果它正在等待(即 waitingt),那么您需要检查 pg_locks 视图,看看还有什么可能锁定关系中的任何内容。

如果等待不是真的,那么你最好检查你的 java 客户端锁代码,但因为这适用于 MySQL 和 Oracle,我认为这不是一个问题.

还有一件事需要注意。我不确定这里的 MySQL 和 Oracle,但 PostgreSQL 限制您每次连接一次只能查询一个。你可能在那里有一些锁定?

当我对列数较多的表批量执行插入语句时,调用statement.executeBatch()时出现挂起。 它特定于 postgresql jdbc 驱动程序。 为了避免这个问题,我们应该增加缓冲区大小 params(SO_SNDBUF, SO_RCVBUF) for socket.

对于Windows,我们必须在寄存器中创建这样的参数:

[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Afd \Parameters]

DefaultReceiveWindow(类型=DWORD)= 1640960(十进制) DefaultSendWindow(type=DWORD) = 1640960(十进制)

这个号码(1640960)是我从网上得到的一般推荐! 它对我有用。