postgres plsql脚本循环卡住了

时间:2013-08-25 00:56:39

标签: postgresql jpa plpgsql postgresql-9.2

我有一个Java程序,它通过JPA(EclipseLink)访问Postgres数据库 首先,我让JPA创建数据库 然后我运行java.sql.Connection(我在实体管理器上通过unwrap()获得)一个pgsql脚本,它操纵创建的数据库。
实体管理器配置为使用连接池(c3p0) 部分脚本删除了表列表的约束 出于某种原因,在放下一些桌子后它会被卡住 没有其他活动事务(pg_stat_activity),并且没有任何未授予的锁(pg_locks)。
我已经在drop constraint语句之前和之后添加了调试打印,并且它们都被打印出来,因此它似乎卡在循环的中间。 从pg_stat_activity中选择时,将为相关事务返回以下结果:

Waiting: false 
State:   Active
Query:   Empty

从检查CPU使用情况来看,似乎postgres进程处于空闲状态。 当我从pgAdmin运行脚本时,它不会卡住,只有当它从Java程序运行时才会卡住。 通常它会在200次循环迭代后卡住,但它也会卡在其他循环中。 在重新定义代码后,问题消失了两次(真正的Vodou) 对于这种情况,我对Postgres分析工具更感兴趣。 任何解决这个僵局的想法或技术都将受到赞赏。

  • 解决问题的一个解决方法是打开一个新的jdbc连接并从那里运行它,但我仍然有兴趣了解如何在未来解决这些问题。

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:0)

似乎问题是plsql脚本使用raise raise来打印调试消息 出于某种原因,当打印过多的脚本时,脚本会卡住。一旦它们被移除,它就会再次开始工作。