- - PR -
DBCPのDBセッションについて
1|2|3|4|5
次のページへ»
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-10-21 22:43
現在作成中のWEBシステムはOracleにDBCPを使用して、接続しています。
DBCP使用後にはclose処理はちゃんとしています。 closeはプーリングを返却するだけとありましたが関係が?? しかしEnter Prise Managerで見てみるとinactiveでセッションが残ってしまっています。 どのように対処したらいいのでしょうか? ブラウザが終了したらDBとのセッションをきるなどといった方法があるのでしょうか? | ||||||||||||
|
投稿日時: 2004-10-21 23:02
プーリング機構はアクティブな
コネクションを保持するものです。 何度も接続・切断を繰り返すとパフォーマンスに 影響を与えてしまうので、その対処の為に使用します。 ですので、プーリングを使用すれば セッションが残っているのは当然のことです。 >closeはプーリングを返却するだけとありましたが関係が?? プーリングにConnectionを返却するのです。 >どのように対処したらいいのでしょうか? DBCPを使うのをやめたらいかがでしょうか。 >ブラウザが終了したらDBとのセッションをきるなどといった方法があるのでしょうか? ブラウザとDB接続は1対1で結ばれていません。 ブラウザがDBに接続しているわけではなく、 APサーバが接続していますので、プーリングを使っている以上 APサーバを落とさないと基本的には接続が保持されます。 ちなみに最大接続数やアイドル数は設定可能です。 | ||||||||||||
|
投稿日時: 2004-10-22 15:03
多分、アプリケーションでクローズしているのに、実際には切断されないため コネクションがリークするのではないかと心配しているのだと思いますが、 切断されずに残ったコネクションは次にクライアントから接続要求が有ったときに 使い回されるので問題無いですよ。 じゃあ、いつコネクションは閉じられるのかと疑問に思うかと思いますが、 アプリケーションサーバーを終了したら無事切断されると思います。 | ||||||||||||
|
投稿日時: 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; } } } | ||||||||||||
|
投稿日時: 2004-10-23 10:55
提示されたコードでは DBCP を利用する意味がありません。
プールの作成が必要なのは、アプリケーション実行中 1 度のみです。 アプリから見た場合、DBCP は Driver または DataSource の形を 取る事がほとんどで、そのためのクラスは最初から揃ってます。 なので、アプリケーションのコードが DBCP に依存する事は、 何か理由がない限り無いと思います。 アプリケーションサーバに JNDI サービス機能があるなら、 BasicDataSource を利用し、DriverManager 経由にしたいなら、 PoolingDriver + JOCL ドキュメントの利用をお勧めします。 [ メッセージ編集済み 編集者: はしもと 編集日時 2004-10-23 10:59 ] | ||||||||||||
|
投稿日時: 2004-10-23 21:55
お返事有難うございました。
お手数ですが、具体的にどのようにソースを変更したらよいか 教えていただけないでしょうか? 私自身、調べた上で、作ったソースなので、、、 (多分調べ方がたりなかったのでしょうが。) | ||||||||||||
|
投稿日時: 2004-10-24 01:29
と言うか、そう言うのは普通アプリケーションサーバーに任す物だと 思うのですが、いったいアプリケーションサーバー(もしくはサーブレットコンテナ) は何を使っているのでしょうか? コネクションプーリングについて調べると普通は自力でプーリングオブジェクトを 作成する方法には行き着かないと思うのですが、もしかしたら アプリケーションサーバーにかなりマイナーな物を使っているとか・・・。 | ||||||||||||
|
投稿日時: 2004-10-24 01:53
どこを参考にするとそういう難しいコードになるのでしょうか? 足りないというより、調べ方が間違っているのだと思います。 記述するコードは
だけになるはずです。 あとはキャッシュするDataSourceの取得(これはキャッシュしないと意味が無いので注意)
接続先DBやパラメータの設定方法はお使いのアプリケーションサーバーのマニュアルに載っているはずです。 |
1|2|3|4|5
次のページへ»