8

接続プールを使用するようにTomcatを設定しましたが、接続でMySQLがタイムアウトした後、以前にプールで開いていた接続が開かれていません。私のcontext.xmlファイルは次のようになります。

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource"
           maxActive="5" maxIdle="3" maxWait="10000"
           username="uname" password="password" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/>

ご覧のとおり、autoReconnectをtrueとして含めましたが、含まれていません。タイムアウトが設定されている8時間後に、データベースでプロセスを確認しました。

4

4 に答える 4

7

検証クエリ属性を追加してみてください。これにより、次のようにタイムアウト後に接続が自動的に閉じられ、再度開かれるようになります。

validationQuery="SELECT 1"
于 2009-12-09T01:55:31.283 に答える
5

まずはautoReconnect物件を手放します。これは接続プールでは必要なく、問題が発生する可能性があります。

次に、ブロック内の JDBC コード内のすべてのリソース ( 、および) を閉じていることを確認します。ConnectionStatementResultSetfinally

これがあなたのケースに当てはまるかどうかはわかりませんが、初心者の間でよくある誤解は、プールされた接続の場合にこれらのリソースを閉じる必要はないと考えているように見えるということです。これは真実ではありません。close()プールされた接続は、大まかに次のようにわずかに変更されたメソッドを持つ接続のラッパー (デコレータ)です。

public void close() throws SQLException {
    if (this.connection is still active) {
        do not close this.connection, but just return it to pool for reuse;
    } else {
        actually invoke this.connection.close();
    }
}

つまり、それらを閉じると、プールされた接続が解放され、将来の再利用のためにプールに戻すことができます。接続を閉じずに取得すると、プールは遅かれ早かれ接続を使い果たします。

于 2009-12-08T23:03:42.263 に答える
1

これは緊急であり、本番環境では、 c3p0などの適切な接続プールを検討することをお勧めします。より堅牢で信頼性が高く、タイムアウトをより適切に処理できます。

于 2009-12-08T22:24:36.353 に答える
0

構成では、アイドル状態の場合に別の接続を作成することは想定されていません。追加してみる

  minIdle="3"

この設定では、DBCP は常に 3 つの接続を維持します。

使用頻度の低いサーバーの 1 つで、まったく同じ動作が見られます。デフォルトの接続タイムアウトは 8 時間であるため、朝に到着しても接続が見られません。それが私たちが期待していたことです。ただし、古い接続が表示され、最初のリクエストが失敗することがあります。この問題を回避するには、次の属性を追加する必要があります。

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"
于 2009-12-09T01:45:13.390 に答える