我尝试在包含200列的表中加载50000行。我每1000行executeBatch()
。我得到了这张桌子的锁。相同的代码适用于MS SQL和Oracle,但postgresql
我得到了这个问题。当我将executeBatch
数字从1000减少到75时,一切正常。
配置文件中是否存在响应批处理缓冲区大小的任何参数?
答案 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)
一般来说,你需要寻找以下内容。
一般来说,首先要检查的是pg_stat_activity system
视图,它会显示正在执行的查询以及它是否处于活动状态,空闲状态,等待状态等等。然后,如果它正在等待(即waiting
是t
),那么您需要查看pg_locks
视图,看看还有什么可能锁定关系中的任何内容。
如果等待不成立,那么最好检查一下客户端锁的java代码,但由于这适用于MySQL和Oracle,我认为这不是问题。
还有一件事需要注意。我不确定MySQL和Oracle在这里,但PostgreSQL每次连接一次限制你一个查询。你可能有一些锁定吗?