JDBC executeBatch()在PostgreSQL中挂起,没有出现错误



我尝试在具有200列的表中加载50000行。我每1000行做一次executeBatch()。我得到了这张桌子的锁。同样的代码适用于MS SQL和Oracle,但对于postgresql,我遇到了这个问题。当我把executeBatch的数量从1000减少到75时,所有的工作都是正确的。

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

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

当我为具有大量列的表批量执行插入语句时,当调用statement.executeBatch()时,发生挂起。它特定于postgresqljdbc驱动程序。为了避免这个问题,我们应该增加套接字的缓冲区大小参数(SO_SNDBUF,SO_RCVBUF)。

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

[HKEY_LOCAL_MACHINE SYSTEM CurrentControlSet Services Afd Parameters]

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

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

通常您需要查找以下内容。

  1. 你真的能把桌子锁上吗
  2. 您还有其他正在等待的java代码锁吗

通常,首先要检查的是pg_stat_activity system视图,它将向您显示正在执行的查询,以及它是否处于活动、空闲、等待等状态。然后,如果它正在等待(即waitingt),那么您将希望检查pg_locks视图,看看还有什么可以锁定关系中的任何内容。

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

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

最新更新