我有一个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分析工具更感兴趣。 任何解决这个僵局的想法或技术都将受到赞赏。
答案 0 :(得分:1)
听起来像JDBC或C3P0问题而不是Postgresql问题,如果PGAdmin有效但你的JDBC方法没有。 您是否通过C3P0连接池记录所有查询以尝试查看是否存在任何数据库级问题? PGAdmin成功的事实让我相信你应该重新检查你的JDBC和C3P0配置是否存在任何问题。
有关数据库锁定的更多详细信息,请参阅以下页面:
答案 1 :(得分:0)
似乎问题是plsql脚本使用raise raise来打印调试消息 出于某种原因,当打印过多的脚本时,脚本会卡住。一旦它们被移除,它就会再次开始工作。