- PR -

DBCPのDBセッションについて

投稿者投稿内容
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 2004-10-21 22:43
現在作成中のWEBシステムはOracleにDBCPを使用して、接続しています。
DBCP使用後にはclose処理はちゃんとしています。
closeはプーリングを返却するだけとありましたが関係が??

しかしEnter Prise Managerで見てみるとinactiveでセッションが残ってしまっています。

どのように対処したらいいのでしょうか?


ブラウザが終了したらDBとのセッションをきるなどといった方法があるのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2004-10-21 23:02
プーリング機構はアクティブな
コネクションを保持するものです。
何度も接続・切断を繰り返すとパフォーマンスに
影響を与えてしまうので、その対処の為に使用します。

ですので、プーリングを使用すれば
セッションが残っているのは当然のことです。

>closeはプーリングを返却するだけとありましたが関係が??
プーリングにConnectionを返却するのです。

>どのように対処したらいいのでしょうか?
DBCPを使うのをやめたらいかがでしょうか。

>ブラウザが終了したらDBとのセッションをきるなどといった方法があるのでしょうか?

ブラウザとDB接続は1対1で結ばれていません。
ブラウザがDBに接続しているわけではなく、
APサーバが接続していますので、プーリングを使っている以上
APサーバを落とさないと基本的には接続が保持されます。
ちなみに最大接続数やアイドル数は設定可能です。
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-10-22 15:03
引用:

タマさんの書き込み (2004-10-21 22:43) より:
しかしEnter Prise Managerで見てみるとinactiveでセッションが残ってしまっています。




多分、アプリケーションでクローズしているのに、実際には切断されないため
コネクションがリークするのではないかと心配しているのだと思いますが、
切断されずに残ったコネクションは次にクライアントから接続要求が有ったときに
使い回されるので問題無いですよ。

じゃあ、いつコネクションは閉じられるのかと疑問に思うかと思いますが、
アプリケーションサーバーを終了したら無事切断されると思います。
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 2004-10-23 00:12
お返事有難うございます。

DBCPのコネクションプーリング数、プーリング期間はどのように設定したらいいのでしょうか?(設定できるんでしょうか?)

方法を教えていただけないでしょうか。

また現状はプーリングの設定をしていないのですが、

DBへの同時接続数 現状のプーリング数を超えたときにプーリング数が1増えるといった
かんじでいいのでしょうか?



ちなみに以下がソース抜粋です

※呼び出し側※
// sessionオブジェクトにDBCPがある場合はそれを使用
if(request.getSession().getAttribute("TransDBCP") != null){
TransDBCP = (TransDBCP)request.getSession().getAttribute("TransDBCP");
}

※呼出クラス※
public Connection getDBCP() throws Exception{

// DBCPをPOOLINGしていない場合はDBCPを作成
if(obj_cn == null){
obj_cn = DriverManager.getConnection(str_dsn, str_user, str_pass);
return obj_cn;


// DBCPをPOOLINGしている場合はDBCPを使いまわす
}else{

Class.forName(str_drv);
// ObjectPoolインスタンスを生成
ObjectPool pool = new StackObjectPool();

// Connectionオブジェクトを生成するためのConnectionFactoryインスタンスを生成
ConnectionFactory cn_factory = new DriverManagerConnectionFactory(str_dsn, str_user, str_pass);

// PoolableConnectionFactoryインスタンスを生成
// 第6引数:true →プールから取り出されたConnectionを自動コミットモードにする
//      false→プールから取り出されたConnectionを自動コミットモードにしない
new PoolableConnectionFactory(
cn_factory
,pool
,null
,null
,false
,true
);

// プーリング機能を持つDataSourceインスタンスを生成
PoolingDataSource sop = new PoolingDataSource(pool);
obj_cn = sop.getConnection();

return obj_cn;
}

}
}
はしもと
大ベテラン
会議室デビュー日: 2003/02/05
投稿数: 182
投稿日時: 2004-10-23 10:55
提示されたコードでは DBCP を利用する意味がありません。
プールの作成が必要なのは、アプリケーション実行中 1 度のみです。

アプリから見た場合、DBCP は Driver または DataSource の形を
取る事がほとんどで、そのためのクラスは最初から揃ってます。
なので、アプリケーションのコードが DBCP に依存する事は、
何か理由がない限り無いと思います。

アプリケーションサーバに JNDI サービス機能があるなら、
BasicDataSource を利用し、DriverManager 経由にしたいなら、
PoolingDriver + JOCL ドキュメントの利用をお勧めします。


[ メッセージ編集済み 編集者: はしもと 編集日時 2004-10-23 10:59 ]
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 2004-10-23 21:55
お返事有難うございました。

お手数ですが、具体的にどのようにソースを変更したらよいか
教えていただけないでしょうか?

私自身、調べた上で、作ったソースなので、、、
(多分調べ方がたりなかったのでしょうが。)
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-10-24 01:29
引用:

タマさんの書き込み (2004-10-23 21:55) より:

お手数ですが、具体的にどのようにソースを変更したらよいか
教えていただけないでしょうか?



と言うか、そう言うのは普通アプリケーションサーバーに任す物だと
思うのですが、いったいアプリケーションサーバー(もしくはサーブレットコンテナ)
は何を使っているのでしょうか?

コネクションプーリングについて調べると普通は自力でプーリングオブジェクトを
作成する方法には行き着かないと思うのですが、もしかしたら
アプリケーションサーバーにかなりマイナーな物を使っているとか・・・。
kito
ベテラン
会議室デビュー日: 2003/03/24
投稿数: 59
お住まい・勤務地: Osaka
投稿日時: 2004-10-24 01:53
引用:

タマさんの書き込み (2004-10-23 21:55) より:
私自身、調べた上で、作ったソースなので、、、
(多分調べ方がたりなかったのでしょうが。)


どこを参考にするとそういう難しいコードになるのでしょうか?
足りないというより、調べ方が間違っているのだと思います。

記述するコードは
コード:
Connection conn = dataSource.getConnection();
try {
    doSomething(conn); //Connectionを使う.
} finally {
    conn.close();
}


だけになるはずです。
あとはキャッシュするDataSourceの取得(これはキャッシュしないと意味が無いので注意)
コード:
DataSource dataSource = (DataSource)new InitialContext().lookup("java:comp/env/jdbc/sampledb");


接続先DBやパラメータの設定方法はお使いのアプリケーションサーバーのマニュアルに載っているはずです。

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