我们有一个用 java 开发的大型模拟,这个模拟的每次运行都是一个在网格中的节点上运行的 jar。通常,大约 3000 个作业跨几个网格运行。jar 中是使用 Hibernate 连接数据库并将数据写入 pg 数据库的类,其中每个作业是表中的一行。因此,基本上每个正在运行的作业都会插入并更新自己的行。
但是由于每个 jar 本质上是独立的,每个运行的 jar 都会创建一个 SessionFactory 来完成工作,我们很快就会超过数据库的最大连接数。我实际上没有意识到 SessionFactory 与数据库建立了连接。我只认为它打开了与数据库的连接以进行事务处理。因此,仅打开会话工厂连接就会限制有多少作业可以记录他们的工作。
我们查看了 pgbouncer,根据文档,似乎连接仅在会话或事务期间发出。这是否包括 SessionFactory 本身建立的连接?由于 SessionFactory 和 max_connections 之后的所有其他作业都被阻止,因此每个作业(可能持续数小时到数天)保持与数据库的打开连接。
谢谢您的帮助