- PR -

tomcatのDB接続コネクションプーリングについて

1
投稿者投稿内容
ひで720
会議室デビュー日: 2002/12/16
投稿数: 9
投稿日時: 2003-07-07 18:21
いつもお世話様です。Java初心者のひで720です。tomcatの
DB接続コネクションプーリングについて、ご教授願います。
<環境>
WEBサーバ側:WIN2000
      tomcat 4.1.18
データソース設定
       JNDI名・データソースURL・JDBCドライバクラス・ユーザ名・パスワード
       有効最大接続数4
       アイドル状態の接続数2
       最大接続待ち時間5000

DBサーバ側:Linux 7.2 postgreSQL7.2

tomcatのAdministration Toolを使用して、コネクション情報を設定し
下記のようなコネクション管理クラスを作成し、3種類の異なったDBへの
接続を行っています。実際、下記の示したコネクション使用側ソースを実行
すると、LinuxのDBサーバ側では3つのpostgreSQLのスレッドが起動され、
そのままtomcatを停止するまで残っています。私は、この3つのスレッドが
DBコネクションのプーリング状態かなと勝手に思っています。この3つの
スレッドがそれぞれのDB接続時に使い回されているのかなと思っていますが、
いまいちよくわかりません。

<Linux側スレッド>
--------------------------------------------------------------
14601 ? S 0:00 postgres: dbA_user dbA idle
14617 ? S 0:01 postgres: dbB_user dbB idle
14618 ? S 0:00 postgres: dbC_user dbC idle
-------------------------------------------------------------
1つのクラスでDB接続しながら、別クラスでもう一度DB接続すると、スレッドが
倍になったりもします。
--------------------------------------------------------------
14601 ? S 0:00 postgres: dbA_user dbA idle
14617 ? S 0:01 postgres: dbB_user dbB idle
14618 ? S 0:00 postgres: dbC_user dbC idle
14619 ? S 0:00 postgres: dbC_user dbC idle
-------------------------------------------------------------
classA
 methodA()
  dbA Connection
   データ読み込み処理など
  |
  +------------------classB(他クラスからも使用する為、新たにDB接続)
                  methodB()
                  dbA Connection
                   |
                  データチェック処理など
                   |
  +-------------------dbA connection close
  |
 dbA 更新処理など
 dbA connection close

非常に読みにくいですが下記についてご教授お願いします。初心者の見解なので
伝わるか心配です。
@コネクションプーリングの基本的な考え方が間違っているのでしょうか
ADB接続時、コネクションプーリングに関係なく単純にLinux側スレッドが増加するのでしょうか。
BコネクションプーリングによるDB接続処理中に別クラスまたはメソッドで同一DB接続しても
いいのでしょうか。


<コネクション使用側>
----------------------------------------------------------------------
Connection connA = DataSourceManager.getDataSource("java:comp/env/jdbc/dbA")
              .getConnection();
Connection connB = DataSourceManager.getDataSource("java:comp/env/jdbc/dbB")
              .getConnection();
Connection connC = DataSourceManager.getDataSource("java:comp/env/jdbc/dbC")
              .getConnection();

各DBの必要テーブル読み込みor更新

使用後、connA.close();
    connB.close();
    connC.close();
----------------------------------------------------------------------

<コネクション管理クラス>
----------------------------------------------------------------------
import java.util.Hashtable;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;

public class DataSourceManager {

  //DataSourceを保存する変数
  private static Hashtable dsTable = new Hashtable();

  //コンストラクタ
  private DataSourceManager() {
  }

  //DataSourceオブジェクトを返すメソッド
  public static DataSource getDataSource(String strDsUrl) throws NamingException, Exception{
    DataSource ds = null;

    try {

      //HashTableからデータソースを獲得する
      ds = (DataSource)dsTable.get(strDsUrl);

      if (ds == null) { //DataSourceを取得していない場合
        Context ctx = new InitialContext();
        ds = (DataSource) ctx.lookup(strDsUrl);

        //データソースをHashTableに格納する 
        dsTable.put(strDsUrl,ds);
      }
      return ds;

    } catch (NamingException e) {
     throw new NamingException("NamingExceptionが発生しました。");
    } catch (Exception e) {
     throw new Exception("Exceptionが発生しました。");
    }
  }
}
----------------------------------------------------------------------
1

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