0

我有一个通过 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 连接并从那里运行它,但我仍然有兴趣了解如何在未来解决此类问题。
4

2 回答 2

1

如果 PGAdmin 有效但您的 JDBC 方法无效,这听起来像是 JDBC 或 C3P0 问题而不是 Postgresql 问题。您是否记录了 C3P0 连接池的所有查询以尝试查看是否存在任何 db 级别的问题?PGAdmin 成功的事实让我相信您应该重新检查您的 JDBC 和 C3P0 配置是否有任何问题。

有关数据库锁定的更多详细信息,请参见以下页面:

于 2013-11-09T00:27:52.527 回答
0

似乎问题在于 plsql 脚本正在使用 raise 通知来打印调试消息。
出于某种原因,当打印太多时,脚本会卡住。一旦它们被移除,它就会重新开始工作。

于 2014-01-30T15:49:20.577 回答