Java JDBC executeBatch()在PostgreSQL中挂起,没有错误
我尝试在表中加载50000行和200列。我每1000行执行一次executeBatch()。我得到了这张桌子的锁。同样的代码适用于MS SQL和Oracle,但对于Java JDBC executeBatch()在PostgreSQL中挂起,没有错误,java,postgresql,jdbc,postgresql-9.1,postgresql-9.2,Java,Postgresql,Jdbc,Postgresql 9.1,Postgresql 9.2,我尝试在表中加载50000行和200列。我每1000行执行一次executeBatch()。我得到了这张桌子的锁。同样的代码适用于MS SQL和Oracle,但对于postgresql我发现了这个问题。当我将executeBatch的编号从1000减少到75时,所有操作都正常 配置文件中是否有响应批处理缓冲区大小的参数 同样的问题通常,您需要查找以下内容 你真的能把桌子锁上吗 您是否有其他正在等待的java代码锁 通常,首先要检查的是pg_stat_activity system视图,该视图将显
postgresql
我发现了这个问题。当我将executeBatch的编号从1000减少到75时,所有操作都正常
配置文件中是否有响应批处理缓冲区大小的参数
同样的问题通常,您需要查找以下内容
pg_stat_activity system
视图,该视图将显示正在执行的查询以及查询是否处于活动、空闲、等待等状态。然后,如果查询正在等待(即waiting
是t
),然后,您将需要检查pg_locks
视图,并查看在关系中还有哪些内容可能被锁定
如果等待不是真的,那么最好检查java代码是否有客户端锁,但由于这对MySQL和Oracle有效,我认为这不是什么问题
还有一件事需要注意。我不确定这里的MySQL和Oracle,但PostgreSQL将每个连接一次只能查询一个查询。您可能在那里有一些锁定?当我批量为具有大量列的表执行insert语句时,当call语句.executeBatch()挂起时。 它特定于postgresql jdbc驱动程序。 为了避免这个问题,我们应该增加套接字的缓冲区大小参数(SO_SNDBUF,SO_RCVBUF) 对于Windows,我们必须在注册表中创建这样的参数:
[HKEY_LOCAL_MACHINE \SYSTEM \CurrentControlSet \Services \Afd \Parameters]
DefaultReceiveWindow(类型=DWORD)=1640960(十进制)
DefaultSendWindow(类型=DWORD)=1640960(十进制)
这个号码(1640960)是我从网上得到的一般推荐!
这对我很有用 您是否检查了应用程序的内存使用情况?驱动程序可能会消耗更多内存,因此经常查找GC。也许仅仅增加堆的大小就足够了,我可以单独运行这个应用程序。只需从数据库中的文件加载数据。如果是这样,请删除标记java,然后删除用java实现的JDBC…如果您知道它与java无关,请不要污染标记,只需删除它即可。否则,它将为您可以添加的任何内容打开大门,例如NetBeans、Windows、Intel等等。。。这是无止境的。我希望你们现在能更好地理解我的观点,我的insert query state=active waiting=f在pg_stat_活动中也遇到了同样的问题。没有连接池的锁我肯定怀疑池逻辑中存在Java对象锁。但是,如果插入查询状态为活动状态,则PostgreSQL正在运行查询。这并不意味着在这一点上存在客户端问题。相反,我们可能会查看插入本身的性能。