【发布时间】:2019-12-03 14:44:09
【问题描述】:
我有一个 Spring Batch 应用程序(尽管我认为我已经消除了 Spring 作为罪魁祸首 -- 更多内容见下文),它使用 org.postgresql 驱动程序的 42.2.8 版本连接到 PostgreSQL 11.1 数据库,作为AWS RDS 实例。该应用程序正在从 Oracle 设置迁移过来,但是每当我尝试运行应用程序来摄取数据时,它都会无限期地锁定进程,并且在某种程度上似乎锁定了数据库本身......
由于某种原因,当转换为以 postgres 为目标时,可以正常摄取到 Oracle 中的代码似乎完全阻塞了 INSERT 语句(无论是 Spring 生成它们,还是我尝试绕过对 Spring 的所有调用,将INSERT 语句和连接信息硬编码到应用程序主函数的顶部)。
除此之外,在我终止挂起的进程之前,我什至无法在 pgAdmin 中执行某些操作。 Web 界面也无限期挂起,我正试图找出它的韵律或原因(我不能怪表,因为其他表可能会被阻塞,有时可以访问;有时我可以建立新的连接,有时我不能;我似乎确实能够可靠地刷新我以前查询过的表,只要我不杀死选项卡/连接)
我不确定 Spring 是在简单调用周围自动装配一些东西还是自动注入一些东西,所以我将制作一个简单的 Java 应用程序来尝试消除这种可能性......我也可以尝试不同的postgres 驱动程序,但我担心它似乎挂起 pgAdmin Web 界面......但无论如何我希望有人遇到过并修复或缓解这种情况,但它并没有以易于 Google 的方式结束文章还没有
有人有这个问题吗?有没有 Spring Batch?
【问题讨论】:
-
当您查看
pg_stat_activity时,该会话的状态是什么。 INSERT 可以“锁定”的唯一情况是,如果有另一个未提交的事务插入了相同的主键值。如果您无法刷新已更改的表,这似乎强烈表明您的应用程序在进行更改时缺少提交 -
我似乎无法建立任何连接来查看该表或自己进行该查询,但我确实要求其他有活动连接的人查询该表并且状态为“活动”,使用 wait_event = "关系", wait_event_type="锁"
-
然后其他一些会话(事务)有未提交的更改 - 因为这是一个 INSERT,事务很可能插入了相同的值。
-
@a_horse_with_no_name 冲突键的并发插入将导致阻塞的 transactionid 锁,而不是阻塞的关系锁。关系锁表明另一个会话正在执行真空满、创建索引等类似操作或显式表锁。
-
okie - 很确定我想通了 - 不知道你们帮了多少忙,但我确实确定有另一个进程被标记为阻塞,这导致我进入另一个保持打开状态的连接,我猜这是由于未提交的截断而阻塞了有问题的表,显然Oracle不介意,或者自动提交(?)......但不管postgres被阻止了。我重组了代码以关闭该连接,它似乎不再阻止事情了。感谢您的耐心等待!
标签: java spring postgresql jdbc