Postgresql的QueryExecutor在' receiveChar() '处无限期挂起,因为查询已经成功完成

我面临一个奇怪的问题,Postgres似乎没有给我的客户端代码发送一个回复,即使成功完成查询。因此,它无限期地挂在阻塞的receiveChar()调用中,等待永远不会到达的东西。注意,这不是一个间歇性的行为,每次我们试图通过Java运行查询时都会发生。

这是阻塞的相关代码。

    boolean doneAfterRowDescNoData = false;
    while (!endQuery) {
      c = pgStream.receiveChar();   // <- blocks here and never comes back 
      switch (c) {
        case 'A': // Asynchronous Notify
          receiveAsyncNotify();
          break;

这是在试图将大约200万条记录从一个表移动到另一个表时发生的。如。

insert into target_table (
   select * from blah where xyz
)

我如何检查它不是查询本身仍然工作,实际上是客户端挂起

查询本身很愉快地完成了,我用多种方法验证了它。

在目标表上选择count(*)并查找传输的数据

确认没有数据库活动。

这里是RDS的Performance选项卡,没有显示任何情况。

类似地,这在数据库本身通过

select relname,
       psa.pid,
       psa.application_name,
       l.granted,
       query,
       l.*,
       psa.*
from pg_locks l
         inner join pg_stat_activity psa ON (psa.pid = l.pid)
         left outer join pg_class c ON (l.relation = c.oid)

这表明没有任何活动。然而,receiveChar()调用仍然在那里等待。

日志没有显示超时、连接中断或异常

日志中的最后一项是参数的查询,然后是转储。

2021-09-18 03:16:52 UTC:72.21.198.65(10130):foo@postgres:[20850]:DETAIL:  parameters: $1 = 'foo', $2 = 'bar'

在这之后。插入完成。我可以在数据库中看到结果。调试器始终挂在receiveChar()行上,等待Postgres的响应。

请想买……

额外的信息

我用的是postgresql = 42.18 version of thPostgres java库的版本。

我是数据库的唯一客户。

日志没有错误。

insert exe执行没有问题,如果我limit it to smaller sets. However 到更小的集合。然而,当完成整个2米的时候,这仍然是相当小的土豆它会做这种悬挂行为。###这不是查询执行器在等待,而是主处理循环中的后端。前面的语句已经完成,现在它正在等待客户端发送下一个命令。你可以通过查看wait_event_type and wait_event in the corresponding pg_stat_activity entry.

wait_event in t在相应的pg_stat_activity entry.

条目。

你看错地方了。似乎是数据库客户机挂起,而不是发送下一条语句。

阅读全文

▼ 版权说明

相关文章也很精彩
推荐内容
更多标签
相关热门
全站排行
随便看看

错说 cuoshuo.com —— 程序员的报错记录

部分内容根据CC版权协议转载;网站内容仅供参考,生产环境使用务必查阅官方文档

辽ICP备19011660号-5

×

扫码关注公众号:职场神器
发送: 1
获取永久解锁本站全部文章的验证码