- PR -

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

投稿者投稿内容
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-12 14:14
はじめまして。

プログラマーではなく運用者の立場なので、初歩的な事かもしれませんがServletのスレッドとDBコネクション数の関係についてご教授頂きたく、質問させて頂きます。

環境は、Linux + Apache2 + Tomcat4.1 + Postgres7.1 で jsp + Servletアプリです。

そもそも不思議なのは、アプリを起動したら直ぐにDBへのコネクションが40程になります。(psql で pg_stat_activity を確認)そしてこの40という値は、ほぼ一定で変化しませんが、たまにpostgresのmax_connectionである100になります。
(アプリでDBコネクションプールは使用していません)

実際には、サイトアクセスはほぼ0です。

Servletのスレッド、等詳しくは知りませんが、Servletのスレッドの数だけ、DBのコネクション数がある?ものなのでしょうか。
推測ですが、tomcat起動後にスレッドが自動で起動し、DBへのコネクションも確保してしまうため、このような現象が起こっている?

この考え方は間違っておりますでしょうか。
※ちなみにスレッド数の設定をserver.xmlで探しましたが見つかりませんでした。
わたなべ
大ベテラン
会議室デビュー日: 2007/12/09
投稿数: 123
お住まい・勤務地: 札幌
投稿日時: 2007-12-12 14:21
アプリケーションのBugのような臭いがします。
ConnectioPoolでなければServletの初期処理から接続に行っており、クローズしてないのではないでしょうか?

DBを落としたままでWebアプリを起動できますか?
ConnectionPoolを使用してなくて、初期処理で接続も行っていないならば起動するはずですよね。

>Servletのスレッドの数だけ、DBのコネクション数がある?
ありません。
尚、Servlet自体にはDBの接続を行う機能はありません。
フレームワークなり実際にコーディングを行わない限り、コネクションは張りません。
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-12 14:58
わたなべ様

早速のご回答ありがとうございます。

Servletの初期処理から接続に行っている可能性があるので、起動と同時にコネクションが張られるのですね。なるほど!
インスタンスを生成して接続してしまうのは分かりましたが、そのままコネクションは維持されつづけるものなのでしょうか?
コネクション数が0(もしくは0に近い値)になる事はなく、ずっと40以上をキープし続けます。ループでもしなければ、コネクションTimeout等がきたら(設定箇所は見つけられてませんが)開放されるのかとも思いましたが。

DBを止めた状態で試せる機会がありましたら、試してみたいと思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-12-12 16:40
接続プールの実装と設定によるものという考えもあります。
関係しそうなのは初期アイドル数(最初から接続しっぱなしの数)です。

環境が分からないので何とも言えませんが、
以下はTomcatでは標準でついてくるデータソースの実装の説明です。
http://www.limy.org/program/java/commons_dbcp.html
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-12 16:43
かつのり様
アドバイス有難うございます。DBCPは使用されていないようなのですが確認してみたいと思います。

とりあえず、以下を試してみました。

Apache、Tomcat、postgres 停止し、Tomcat、apacheを起動。起動できました。

この時点でコネクション数は0でした。(netstatで確認)

その後、postgresを起動。
公開用URLへアクセス後、pg_stat_activity で確認。31コネクション。
管理用URLへアクセス後、pg_stat_activity で確認。41コネクション。

その後、他PCからアクセスしてもコネクション数に推移はありません。
なのでユーザアクセス数とは関係なく、アクセスするモジュールによってインスタンスが新しく作られ、コネクションが増えて行く?ように見えました。

もう少し調査していきたいと思います。

[ メッセージ編集済み 編集者: tohero0987 編集日時 2007-12-12 16:48 ]
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-12-12 17:23
apahceのプロセスと同じだと考えればわかりやすいのではないでしょうか。

最小数の接続を用意する。破棄されて足りなくなってたら補充する。
要求があったら貸し出す。用意している数が足りなかったら増やす。最大数を越える場合は待たせる。
処理が終わったら返してもらう。最初に戻る。

これらは、要求に迅速に応答するのが目的のサービスです。

JNDI Resources HOW-TO
$CATALINA_HOME/conf/server.xmlの設定に従っているのではないでしょうか。
コード:
    <parameter>
      <name>maxActive</name>
      <value>8</value>
    </parameter>
    <parameter>
      <name>maxIdle</name>
      <value>4</value>
    </parameter>


webappごとでなく、servlet engineで数が決まる気がしますが。
tohero0987
常連さん
会議室デビュー日: 2007/05/28
投稿数: 39
投稿日時: 2007-12-12 18:20
Ray様

情報ありがとうございます。

Servletエンジン(Tomcat)全体で、DBへのコネクションを使いまわしており、足りなくなったら新たにコネクションを作る。=Tomcatは標準でコネクションプーリングを実装している(DBCPを使わなくても)という認識でよいのでしょうか。。

なのでwebappsが異なるものからDBアクセスがあっても、コネクション数の増加には起因しないという事なのですね。

ちなみに、server.xml や web.xml のdb関連の箇所にmaxActiveやmaxIdle等は設定されておりませんでした。デフォルト値?はいったい。。

Servletエンジンは複数起動されていないようです。※tomcatプロセスは1個しかない為
Ray
ベテラン
会議室デビュー日: 2007/09/13
投稿数: 88
投稿日時: 2007-12-12 18:40
>Servletエンジン(Tomcat)全体で、DBへのコネクションを使いまわしており、足りなくなったら新たにコネクションを作る。=Tomcatは標準でコネクションプーリングを実装している(DBCPを使わなくても)という認識でよいのでしょうか。。

TomcatにDBCPが含まれていると認識しています。こんなファイルがないか探してみたらいかがでしょう。
$ dpkg -L libtomcat5.5-java|grep dbcp
/usr/share/tomcat5.5/common/lib/commons-dbcp.jar

>ちなみに、server.xml や web.xml のdb関連の箇所にmaxActiveやmaxIdle等は設定されておりませんでした。

db関連の記述とは、プーリングするというものだったのでしょうか。

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