JDBC executeBatch() 在 PostgreSQL 中无错误地挂起
JDBC executeBatch() hangs without error in PostgreSQL
我尝试在 table 中加载 200 列的 50000 行。我每 1000 行做 executeBatch()
。我为此获得了锁定 table。相同的代码适用于 MS SQL 和 Oracle,但对于 postgresql
我遇到了这个问题。当我将 executeBatch
数字从 1000 减少到 75 时,一切正常。
配置文件中是否有任何参数 响应批处理缓冲区大小?
一般需要查找以下内容。
- 你真的能得到 table 的锁吗?
- 您还有其他 java 密码锁在等待吗?
一般来说,首先要检查的地方是 pg_stat_activity system
视图,它会向您显示正在执行的查询以及它是否处于活动状态、空闲状态、等待状态等。如果它正在等待(即 waiting
是 t
),那么您需要检查 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)是我从网上得到的一般推荐!
它对我有用。
我尝试在 table 中加载 200 列的 50000 行。我每 1000 行做 executeBatch()
。我为此获得了锁定 table。相同的代码适用于 MS SQL 和 Oracle,但对于 postgresql
我遇到了这个问题。当我将 executeBatch
数字从 1000 减少到 75 时,一切正常。
配置文件中是否有任何参数 响应批处理缓冲区大小?
一般需要查找以下内容。
- 你真的能得到 table 的锁吗?
- 您还有其他 java 密码锁在等待吗?
一般来说,首先要检查的地方是 pg_stat_activity system
视图,它会向您显示正在执行的查询以及它是否处于活动状态、空闲状态、等待状态等。如果它正在等待(即 waiting
是 t
),那么您需要检查 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)是我从网上得到的一般推荐! 它对我有用。