私の問題は、これらの例外が発生している 2 つのアプリがあることです。
原因: org.apache.tomcat.jdbc.pool.PoolExhaustedException: [pool-2-thread-273] タイムアウト: プールが空です。30 秒以内に接続をフェッチできませんでした。使用できるものはありません[サイズ:100; ビジー:99; アイドル:0; lastwait:30000]。
次の 2 つのアプリがあります。
- PostgresデータソースAに接続するTomcatで実行されているgrails app war
- postgres データ ソース A と同じサーバー上の別のデータベースであるデータ ソース B に接続するスタンドアロン jar。
どちらのアプリもデフォルトで org.apache.tomcat.jdbc.pool.ConnectionPool を使用しているようです (デフォルトのプールをどこにも設定しておらず、両方のアプリがこれを使用しているため)。また、私の最大接続制限は 200 で、130 未満の接続しか使用していないため、最大接続の問題は発生していません。2 つのアプリが別々のデータ ソースを使用しているため、同じ conn プールにすることはできないということを読みました。
postgres サーバーにログインすると、アプリ 2 には 100 のアイドル接続があり、プールの最大アイドル サイズは 100 であることがわかります。これで問題ありません。しかし、私が期待していなかったのは、アプリ 1 がアプリ 2 のプールからの接続を使用するということです。つまり、アプリが接続プールを共有しているように見えるので、アプリ 1 は、既に 100 を持っているこの共通プールから取得しようとしていると思います。割り当てられた接続。彼らはTomcat connプールを使用し、AppBはTomcatさえ使用していないので、なぜそれらが共有されるのでしょうか...
私の質問は次のとおりです(これに関するドキュメントを見つけるのに本当に苦労しているため):
- デフォルトで異なるアプリが同じ接続プールを使用するというのは正確ですか?
- 同じ接続プールを使用している場合、異なるデータ ソースを使用している場合、どのように接続プールを共有できますか?
- grails で共有と非共有の conn プールを指定することは可能ですか? https://tomcat.apache.org/tomcat-7.0-doc/jndi-datasource-examples-howto.html このリンクは特にpostgresについて言及しており、共有対非共有の概念があるようです(ただし、適切なドキュメントは見つかりませんこれについて)しかし、それはgrailsの外で設定されています。Grailsでそれを行う方法はありますか?
注: grails 2.4.5 および postgres サーバー 90502 を使用