- PR -

Servletのスレッド数?とDBコネクション数について

投稿者投稿内容
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-12 19:02
Ray様、毎回コメントありがとうございます。

commons-dbcp-1.2.1.jarというファイルはございました。
ただ、環境&アプリを構築したのが開発会社で、そちらの方はほとんど設定は変更していないようです。(プールもしてない、と言っておりました)

DB関連の記載にプールうんぬん、という事は書かれておりませんでした。
接続先DB、User、ドライバ等くらいしか見当たりません。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2007-12-13 01:59
Tomcat には標準で DBCP が組み込まれているので DB 接続プーリング機能が
利用できますが、ウェブアプリがそれを利用する様に作られていなければ
利用できません。
そのウェブアプリはどうやって DB と接続しているのでしょうか。

server.xml に JNDI DataSource の設定がしてあったとしても、
DBCP の BasicDataSourceFactory 以外の factory を利用する設定に
なっていたら、同じく利用できません。
どんな設定になっているのでしょうか。

そのウェブアプリが DBCP 経由で DB と接続していると仮定すると、
まず解らないのが、デフォルトの maxActive は 8 なので
8 接続以上できない筈です。
にもかかわらず 40 接続にもなっているという事は、
何処かで DBCP の設定がなされているのではないでしょうか。
そこに maxIdle が 40 と設定されているとか。

ちなみに、一般的なウェブアプリはリクエスト毎に DB との接続、切断を
してしまいますが、そうではなく作ることも可能なので、
40 接続している事だけで異常だと判断する事はできないです。
蒋 いつ峰
会議室デビュー日: 2005/10/08
投稿数: 11
投稿日時: 2007-12-13 14:15
設定には問題がなさそうな気がしますね。プログラムをチェックしたら如何でしょうか?例えばコネクションを閉じるのを忘れてしまったとか。
_________________
ブログ
http://uprushworld.blogspot.com/

助君 -- あなた専用のカスタマイズ ウェブナビ
http://www.sukekun.com/

A website and community for programmer
http://uprush.net
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-13 15:57
はしもと様 uprush様

アドバイス有難うございます。

どのxmlファイル中にもmaxActive等のWordがないので設定はされていないと思います。
私はアプリのコード側は基本的にはタッチしない前提ですが、ソースを見た所、extends InitializerのクラスでDriverManager.getConnectionでconを作ってます。
try catch及びfinallyで、con.close();の記述は見られます。

extends HttpServletのサーブレットで、JDBCドライバロードをClass.forName(○○).newInstance();でインスタンス化?しています。その後、con.closeはしてまして、finallyでもcon.closeは書かれています。

ただ、一部のクラスのstaticメソッドではfinallyがなく、try catchでcon.closeも無い箇所がありました。

ちなみにドライバは「org.postgresql.Driver」のようです。
私で調査できるのはこの位までかもしれません。

コネクションの閉じ忘れにしても除々に増えるならわかりますが、パターンとして40、70、100(max)というパターンでこの間は急激な増え方をします。(5分毎のコネクション数統計情報を見ると)
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2007-12-13 16:30
Connectionが増加してる時に、DBをシャットダウンしてみては?
どこかで例外が発生するかもしれません。
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2007-12-13 19:05
引用:
tohero0987さんの書き込み (2007-12-13 15:57) より:

どのxmlファイル中にもmaxActive等のWordがないので設定はされていないと思います。
私はアプリのコード側は基本的にはタッチしない前提ですが、ソースを見た所、extends InitializerのクラスでDriverManager.getConnectionでconを作ってます。
try catch及びfinallyで、con.close();の記述は見られます。

extends HttpServletのサーブレットで、JDBCドライバロードをClass.forName(○○).newInstance();でインスタンス化?しています。その後、con.closeはしてまして、finallyでもcon.closeは書かれています。



DriverManager 経由で DBCP の PoolingDriver を使う方法もありますが、
アプリ開発者がプーリング機能は利用していないと言っている事からすると
このケースは無いでしょう。
だとすると、DBCP は無関係だと思います。

よって、そのウェブアプリは直接 DB と数十接続しているのでしょう。
あとは、その動作が開発者の意図した動作なのかどうかです。
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-12-13 23:14
>extends HttpServletのサーブレットで

サーブレットの初期化部分やインスタンス変数に書いてあったのでしょうか。

>私はアプリのコード側は基本的にはタッチしない前提ですが、

ソースにタッチしない方針であるならば、ソースを管理している担当に調査を依頼すべきでは。
必要であれば、最大接続数が100未満になるような仕様を要求したり。
蒋 いつ峰
会議室デビュー日: 2005/10/08
投稿数: 11
投稿日時: 2007-12-14 20:14
引用:

ただ、一部のクラスのstaticメソッドではfinallyがなく、try catchでcon.closeも無い箇所がありました。



ソースのチェックが要ると思います。また、DBコネクションを管理(生成、閉じる)する場所が複数あることが気になりました、集中で管理したほうが管理しやすいと思いますが。
_________________
ブログ
http://uprushworld.blogspot.com/

助君 -- あなた専用のカスタマイズ ウェブナビ
http://www.sukekun.com/

A website and community for programmer
http://uprush.net

スキルアップ/キャリアアップ(JOB@IT)