- PR -

プールされた接続のリセット

投稿者投稿内容
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-10-13 15:40
Servletからコネクションプーリングを利用して、RDBMSに接続するアプリケーションを前提とする質問です。
Servletコンテナの種類は限定しません。
RDBMSはOracleですが、今回の質問にはあまり関係がありません。

コネクションプーリングでプールされている接続を、コンテナが起動している間に、ある程度の間隔でリセット(切断、再接続)したいのです。
一定時間おきでも構いませんし、事前に決められた回数だけ利用されたらリセットでも構いません。
手動でリセット(1本ずつでもまとめてでも)できるようなものでもいいです。
とにかく、オンライン処理に影響を与えずに、DBセッションの寿命に上限を設けたいのです。

このような設定・操作が可能なコネクションプーリングコンポーネントを知りませんか?
オープンソースでも商用プロダクトに付属のコンポーネントでもよいです。

ちなみに理由を先に言っておくと、つながりっぱなしだとゴミが溜まるから、くらいでご理解下さい。ゴミと言っても、こちらの都合で溜めてるものなのですが、それをクリアする方法がセッション切断しかないのです。

よい情報がお持ちでしたらぜひ教えてください。よろしくお願いします。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-10-13 16:34
WLS ならコマンドラインや MBean ベースでリセットできます。
http://edocs.beasys.co.jp/e-docs/wls/docs81/admin_ref/cli.html#1156066

またプール使用時にテストクエリを発行して接続が有効かどうかテストすることもできます。
http://edocs.beasys.co.jp/e-docs/wls/docs81/jdbc/programming.html#1053561

[ メッセージ編集済み 編集者: インギ 編集日時 2004-10-13 16:36 ]
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-10-13 17:33
インギさん、情報どうもありがとうございます。

WLSに関してはちょっとしたジョブを定時起動すればどうにかなりそうですね。

IBM WASに関しても調べてみたところ、管理コンソールからコネクションプールを設定する際に「経過タイムアウト」というのが設定でき、物理接続が破棄されるまでの時間を指定できるようです。これはどんぴしゃ。

http://publib.boulder.ibm.com/infocenter/ws51help/index.jsp?topic=/com.ibm.websphere.base.doc/info/aes/ae/udat_conpoolset.html

オープンソースの雄 Tomcat ではDBCPがメジャーでしょうか。
これについても調べてみます。

もし他にメジャーなコネクションプーリングコンポーネントがあれば、ぜひ情報提供お願いします。コンポーネントの名前だけでも結構です。マニュアルなど公開されていれば自分で調べてみます。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-10-14 09:20
引用:

カーニーさんの書き込み (2004-10-13 17:33) より:
オープンソースの雄 Tomcat ではDBCPがメジャーでしょうか。
これについても調べてみます。



Jakarta Commons DBCPの場合、パラメータで設定、というのは無理そうですね。
http://jakarta.apache.org/commons/dbcp/configuration.html

PoolingDataSourceで使用するObjectPoolの、invalidateObject(Object)メソッドを叩くと良いような気もしますが、ちょっと今回はそこまでは。
raystar
ぬし
会議室デビュー日: 2003/01/16
投稿数: 251
お住まい・勤務地: Tokyo/Japan
投稿日時: 2004-10-14 15:48
こんにちは

ObjectPoolの close() メソッドで保有している
全コネクションを解放することができますよ。

closeしたら、再取得すれば、いいのではないでしょうか。

また、一定時間の間隔でプールをリセットする場合は
java.util.Timer クラスを使えば便利だと思います。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Timer.html

ただ、リセット中にアクセスがあった場合・・・
とかいうことは、考えていませんのであしからず。

カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-10-14 16:31
情報提供どうもありがとうございます。

引用:

raystarさんの書き込み (2004-10-14 15:48) より:
ObjectPoolの close() メソッドで保有している
全コネクションを解放することができますよ。

closeしたら、再取得すれば、いいのではないでしょうか。

また、一定時間の間隔でプールをリセットする場合は
java.util.Timer クラスを使えば便利だと思います。
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/util/Timer.html

ただ、リセット中にアクセスがあった場合・・・
とかいうことは、考えていませんのであしからず。



なるほど。
プールをクローズしたときに接続中のセッションはどうなるとか、
クローズから再オープンまでの短い間に接続要求があった場合の挙動が心配ですね。

当方、パッケージ製品のDeveloper(もどき)なので、運用に多くの前提を置けず、
なるべく汎用的に考えないといけないのが辛いところです。

ちなみにOracle9iASはマニュアルを見る限り、パラメータに設定箇所なし、APIのほうはAPIリファレンスが見つからず、で困ったもんです。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2004-10-14 16:55
そもそもゴミがたまるとはどういった状態でしょうか?
正しく ResultSet/Statement などをクローズしていればセッションが続く限り正常にコネクションを利用できると思いますが。
コネクションプール機構に dirty solution を求めるより根本原因を解決したほうが良いかと思います。
カーニー
ぬし
会議室デビュー日: 2003/09/04
投稿数: 358
お住まい・勤務地: 東京
投稿日時: 2004-10-14 17:14
引用:

インギさんの書き込み (2004-10-14 16:55) より:
そもそもゴミがたまるとはどういった状態でしょうか?



最初に書いたとおり、セッションを切らない限り掃除できないゴミを
プロダクトの都合で貯めているのです。

詳しくはこちらをご参照下さい。
http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=14133&forum=10

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