1

我的问题是我有两个应用程序都出现这些异常:

引起:org.apache.tomcat.jdbc.pool.PoolExhaustedException:[pool-2-thread-273] 超时:池为空。无法在 30 秒内获取连接,无可用 [size:100; 忙:99;空闲:0;最后等待:30000]。

有两个应用程序:

  1. 在 tomcat 中运行的 grails 应用程序战争连接到 postgres 数据源 A
  2. 连接到数据源 B 的独立 jar,该数据源 B 是与 postgres 数据源 A 在同一服务器上的不同数据库。

默认情况下,这两个应用程序都使用 org.apache.tomcat.jdbc.pool.ConnectionPool (因为我没有在任何地方配置默认池,两个应用程序都使用它)。另外,我的最大连接限制是 200,并且只使用 < 130 个连接,所以我没有遇到最大连接问题。由于两个应用程序使用不同的数据源,我读到这意味着它们不能是同一个连接池。

当我登录到我的 postgres 服务器时,我可以看到应用程序 2 有 100 个空闲连接,并且池的最大空闲大小为 100。所以这很好。但是,我没想到的是我的应用程序 1 会使用来自应用程序 2 池的连接——或者更确切地说,因为应用程序似乎共享一个连接池——我想应用程序 1 正试图从这个已经有 100 个的公共池中获取分配的连接。我真的没想到因为他们使用tomcat conn pool而AppB甚至不使用tomcat,所以为什么要共享它们……

所以我的问题是(因为我真的很难找到关于这个的文档):

  1. 默认情况下不同的应用程序将使用相同的连接池是否准确?
  2. 如果他们使用相同的 conn 池,那么如果他们使用不同的数据源,他们如何共享一个 conn 池?
  3. 是否可以在 grails 中指定共享与非共享连接池? https://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html 这个链接特别提到了postgres,似乎有共享与非共享的概念(尽管我找不到任何好的文档关于这个),但它是在 grails 之外配置的。有什么办法可以在grails中做到这一点?

注意:使用 grails 2.4.5 和 postgres 服务器 90502

4

0 回答 0