1

Tomcat DBCPを次のように構成しました。

<Resource
name="jdbc/myoracle"
auth="Container"
type="javax.sql.DataSource"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:mysid"
username="abc"
password="abc"
maxActive="20"
maxIdle="4"
minIdle="0"
maxWait="4"
removeAbandoned="true"
logAbandoned="true"
removeAbandonedTimeout="3"
/> 

上記の設定が正しいかどうかはわかりません。私はstruts 2を使用しています.Webページにはメニューリンクがあり、すべてのdb操作を実行し、プーリングとの間の接続を開いたり閉じたりするアクションクラスを呼び出しています。問題は、メニュー リンクを 40 ~ 50 回連続してクリックし続けると、接続が増加し、マウスを 1 回クリックしてから応答を待つと正常に動作する (つまり、接続が増加しない) ことです。

単一の応答を待たずに狂ったように連続してクリックすると、接続が急激に上昇し、最初の状態に戻りません。私の接続がアクション クラスのどこかでリークしている場合、マウスを 1 回クリックし、応答を待ってから別のマウス クリックに対して常に正常に動作しているのはなぜですか?

(同じメニューリンクの結果を連続してクリックする:) maxActive を 20 と定義したので、接続は 24 まで続き (私が覚えているように)、その後プールが使い果たされます。つまり、新しい接続/要求は、使い果たされたプールから接続を取得するために無期限に待機します。

ここで私の疑問は、removeAbandonedTimeout = 3を指定したのに、なぜremoveAbandonedが接続を閉じていないのかということです。接続メモリ リークがあると仮定した場合、または意図的に接続を閉じていない場合、removeAbandoned は開いているすべての接続を強制終了しますか?

または、DBCP 設定または上記のパラメーターに問題がありますか? これを整理するのを手伝ってください。

4

1 に答える 1

2

maxWaitパラメータの値が小さすぎると思います。ドキュメントによると、その測定単位はミリ秒です。利用可能なすべての接続が割り当てられると、あなたの場合、わずか 4 ミリ秒待機し、例外がスローされます。

また、minIdleパラメーター値の値を増やすことをお勧めします。これにより、常に使用可能な「準備された」接続がいくつか存在するようになります。もちろん、maxIdle後でパラメーター値の値をさらに増やす必要がある場合もあります。

パラメータに関してはremoveAbandonedTimeout、その値がデータベース操作の実行に必要な秒数よりも大きいことを確認してください。

もう 1 つ注意すべき点は、true に設定logAbandonedすると、接続借用プロセスにオーバーヘッドが追加されることです。

于 2013-01-18T17:58:35.387 に答える