- - PR -
tomcatのDB接続コネクションプーリングについて
1
| 投稿者 | 投稿内容 |
|---|---|
|
投稿日時: 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
