我有一个通过 JPA (EclipseLink) 访问 Postgres 数据库的 Java 程序。
首先我让 JPA 创建数据库。
然后我通过一个 java.sql.Connection (我通过实体管理器上的 unwrap() 获得)一个 pgsql 脚本来操作创建的数据库。
实体管理器配置为使用连接池 (c3p0)。
部分脚本删除表列表的约束。
由于某种原因,它在删除许多表后卡住了。
没有其他活动事务(pg_stat_activity),也没有任何未授予的锁(pg_locks)。
我在 drop 约束语句之前和之后添加了调试打印,并且它们都被打印了,所以它似乎卡在了循环的中间。从 pg_stat_activity 中选择时,将为相关事务返回以下结果:
Waiting: false
State: Active
Query: Empty
从检查 CPU 使用情况来看,postgres 进程似乎是空闲的。当我从 pgAdmin 运行脚本时,它不会卡住,只有当它从 Java 程序运行时。通常它会在 200 次循环迭代后卡住,但它也会卡在其他循环中。重新编写代码后,问题消失了两次(真正的 Vodou)。
我对此类场景的 Postgres 分析工具更感兴趣。任何解决此死锁的想法或技术都将受到赞赏。
- 解决该问题的一种解决方法是打开一个新的 jdbc 连接并从那里运行它,但我仍然有兴趣了解如何在未来解决此类问题。