0

私はあなたが私を助けてくれることを願っています.本番環境でエラーが発生しています.MySqlコネクタバージョン5.1.2およびApacheコモンズ接続プールバージョン1.3でSpringメインアプリケーションJava 1.7を実行しています.

私の春のデータソース構成:

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="${db.driverClassName}" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.username}" />
        <property name="password" value="${db.password}" />
        <property name="maxActive" value="100" />
        <property name="maxWait" value="1000" />
        <property name="poolPreparedStatements" value="true" />
    </bean>

数時間実行した後、例外 org.apache.commons.dbcp.SQLNestedException: Cannot get a connection, pool error Timeout waiting for idle object が発生しました

最初は接続リークがあると思いました.netstatを実行してDB接続を確認した後、すべてが適切に管理されており、maxActive値よりもはるかに低いはずなので、接続の量が適切に維持されていることがわかりました...

もう1つの奇妙なことは、そのメインアプリケーションの3つのインスタンスが常に実行されており、ビジネスロジック構成が異なりますが、データソース構成はそれぞれ同じです。他の 2 つは、通常どおり DB から接続を取得しています。

MySql db からの接続をプールする Java インスタンスを除いて、DB と通信するサービスは他にもありますが、DB への合計接続数は MySql 構成よりもはるかに少なくなっています。

その例外に関する関連記事を読みましたが、主な問題は接続リークでしたが、私の場合、何も得られていないと確信しています。

ご協力いただきありがとうございます....

4

1 に答える 1

0

Java インスタンスの 1 つがデータベースとの接続を失いますが、BasicDataSource はこの問題を処理しますが、maxWait プロパティ値 1000 を指定しているため、プールは接続が返されるまで 1000 ミリ秒だけ待機してから例外をスローし、その maxwait タグを削除するか、-無期限待機の場合は 1 の値。

このプールからの接続を検証するには、validationquery プロパティを使用する必要があります

BasicDataSource に一部の構成が欠落しているため、以下の構成プロパティを追加して問題を解決します

<property name="testWhileIdle" value="true" /> 
<property name="validationQuery"><value>SELECT 1</value></property>
<property name="testOnBorrow"><value>true</value></property>

詳細な構成については、このリンクを参照してくださいhttp://commons.apache.org/proper/commons-dbcp/configuration.html

于 2013-07-19T12:11:37.303 に答える