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

时间:2016-05-12 14:15:42

标签: java postgresql jdbc postgresql-9.1 postgresql-9.2

我尝试在包含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

2 个答案:

答案 0 :(得分:1)

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

对于Windows,我们必须在注册中创建这样的参数:

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

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

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

答案 1 :(得分:0)

一般来说,你需要寻找以下内容。

  1. 你能真正锁定桌子吗?
  2. 您还有其他等待的java代码锁吗?
  3. 一般来说,首先要检查的是pg_stat_activity system视图,它会显示正在执行的查询以及它是否处于活动状态,空闲状态,等待状态等等。然后,如果它正在等待(即waitingt),那么您需要查看pg_locks视图,看看还有什么可能锁定关系中的任何内容。

    如果等待不成立,那么最​​好检查一下客户端锁的java代码,但由于这适用于MySQL和Oracle,我认为这不是问题。

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