23

定期的にエラーが発生します:

エラー JDBCExceptionReporter --> javax.resource.ResourceException: IJ000453: Unable to get managed connection for java:jboss/datasources/myDB 08:12:05,928 エラー [org.apache.catalina.core.ContainerBase.[jboss.web].[ default-host].[/mySoftware].[jsp]] (ajp--xx.255.0.yyy-8109-21) サーブレット jsp の Servlet.service() が例外をスローしました: javax.resource.ResourceException: IJ000655: 管理された接続がありませんorg.jboss.jca.core.connectionmanager.pool.mcp.SemaphoreArrayListManagedConnectionPool.getConnection(SemaphoreArrayListManagedConnectionPool.java:377) などで設定されたブロッキング タイムアウト (30000 [ms]) 内で利用可能。

.

だから、私は次のデータソース構成を持っています。JBoss AS で:

<datasource jta="true" jndi-name="java:jboss/datasources/myDB" pool-name="ssbs-pssbs" enabled="true" use-ccm="true">
                    <connection-url>jdbc:postgresql://xx.255.0.yyy/myDatabase</connection-url>
                    <driver-class>org.postgresql.Driver</driver-class>
                    <driver>postgresql-jdbc4</driver>
                    <pool>
                        <min-pool-size>30</min-pool-size>
                        <max-pool-size>150</max-pool-size>
                        <prefill>true</prefill>
                        <use-strict-min>false</use-strict-min>
                        <flush-strategy>FailingConnectionOnly</flush-strategy>
                    </pool>
                    <security>
                        <user-name>tick</user-name>
                        <password>tack</password>
                    </security>
                    <validation>
                        <check-valid-connection-sql>SELECT 1</check-valid-connection-sql>
                        <validate-on-match>false</validate-on-match>
                        <background-validation>false</background-validation>
                    </validation>
                    <timeout>
                        <blocking-timeout-millis>30000</blocking-timeout-millis>
                        <idle-timeout-minutes>5</idle-timeout-minutes>
                    </timeout>
                    <statement>
                        <share-prepared-statements>false</share-prepared-statements>
                    </statement>
                </datasource>

私のPostgresサーバーでは、500でmax_connectionを許可しています。なぜこの例外が発生するのですか?

4

1 に答える 1

7

あなたの主な問題はおそらく接続リークですが、そうではないかもしれません。つまり、データベース トランザクションはプールを離れており、返されていません。この場合、問題はおそらくコードの問題であり、データベースの問題ではないため、開始する特定の事柄がいくつかあります。

最初に確認することは、 内のすべての現在のステータスですpg_stat_activity。これには、最新のクエリとトランザクションの状態が含まれます。IDLE接続リークでは、同様のクエリを持つ多数の接続が見つかる可能性があります。クエリは、接続リークを追跡するのに役立ちます。また、接続リークでは、問題が発生すると、再起動するまで続きます。

問題が実際に利用可能な接続が少なすぎる場合、多くのACTIVE接続が表示されます。その場合は、プール内の接続数を増やしてください。この場合も、問題が断続的に発生し、その後、自然に進行しているように見えます。

于 2016-12-23T06:58:29.620 に答える