我有一个Java程序,它通过JPA (EclipseLink)访问Postgres数据库。
首先,我让JPA创建数据库。
然后,我运行一个java.sql.Connection (通过对实体管理器展开()获得),一个pgsql脚本操作创建的数据库。
实体管理器被配置为使用连接池(c3p0)。
脚本的一部分删除了表列表的约束。
由于某种原因,它在丢弃了许多表后就陷入了困境。
没有其他活动事务(pg_stat_activity),也没有任何未授予的锁(pg_locks)。
我在drop约束语句之前和之后添加了调试打印,它们都是打印出来的,因此它似乎被卡在循环的中间。当从pg_stat_activity中选择时,将返回相关事务的下列结果:
Waiting: false
State: Active
Query: Empty从检查CPU使用情况来看,postgres进程似乎是空闲的。当我从pgAdmin运行脚本时,它不会卡住,只有当它从Java程序运行时才会卡住。通常情况下,它在200次循环迭代后会被卡住,但在其他循环中也会被卡住。重设代码后,这个问题消失了两次(真Vodou)。
我对Postgres分析工具更感兴趣。任何解决这一僵局的想法或技术都将不胜感激。
发布于 2013-11-09 00:27:52
这听起来像是一个JDBC或C3P0问题,而不是Postgresql问题,如果PGAdmin有效,但是您的JDBC方法不起作用。您是否记录了C3P0连接池程序的所有查询,以尝试查看是否存在任何数据库级别的问题?PGAdmin成功的事实使我相信,您应该重新检查您的JDBC和C3P0配置,以解决任何问题。
有关db锁定的更多详细信息,请参见以下页面:
发布于 2014-01-30 15:49:20
问题似乎在于plsql脚本正在使用引发通知来打印调试消息。
由于某些原因,当太多的这些打印时,脚本会被卡住。一旦他们被移除,它又开始工作了。
https://stackoverflow.com/questions/18424650
复制相似问题