- PR -

DBCP

1
投稿者投稿内容
牙狼
会議室デビュー日: 2004/06/09
投稿数: 16
投稿日時: 2004-09-18 18:24
こんにちは。
ここのDBCP接続のサンプルを使っていろいろと実験してるのですが(爆
http://www.atmarkit.co.jp/fjava/rensai2/jakarta06/jakarta06.html
ひとつ疑問に思ったことがあるので質問します。

接続してプールを返却した後、更新ボタンを押してリフレッシュさせ、もう一度接続すると、更新する前のプールは継続されて使えるのでしょうか?

分かりにくくてすみません。よろしくお願いします。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2004-09-18 20:01
引用:

接続してプールを返却した後、更新ボタンを押してリフレッシュさせ、もう一度接続すると、更新する前のプールは継続されて使えるのでしょうか?

分かりにくくてすみません。よろしくお願いします。



えーと……ちょっと整頓します。

引用:

接続してプールを返却した後



返却するのは「接続(Connection)」です。「接続プール」返却します。以下、牙狼さんの投稿内「プール」を「接続」と読み替えての返答になります。

引用:

更新ボタンを押してリフレッシュさせ、もう一度接続すると、更新する前のプールは継続されて使えるのでしょうか?



まず、プール自体に関してですが、プーリング機能を持つDataSourceインスタンスは「jspInitメソッド内で生成→JSP(サーブレット)に格納」されていますから、インスタンスが消滅するまではずっと同じプールが使用されます。
JSP(サーブレット)のインスタンスはアプリケーションのアンデプロイやサーバの再起動、JSPファイルの更新を行った場合等に作り直されると思います。
#DataSourceをtoString()してみると確認出来ると思います。

で、もう一度アクセスした場合、JSPはプールから接続を取得しようとしますが、プールの中のどの接続が取得対象になるかは不定のはずです。プール内に接続が残っていればそれを返してくることが多いとは思いますが、プールの同時接続数上限に達していなければ新規接続を作成してそれを返してくるかも知れません。直前にプールに返したものが返ってくるかも知れませんし、2回前のものかも知れません。

ついでに。トランザクションとしては、Poolの返却前と再取得後で一つの連続したトランザクションに出来なくもないですが、上に書きましたように、動作が予期できませんので「返却・再取得」をまたぐトランザクションは通常あり得ません。
#バグとして時折見掛けたりしますが(涙

以上で疑問にお答えできているでしょうか?
牙狼
会議室デビュー日: 2004/06/09
投稿数: 16
投稿日時: 2004-09-18 21:17
ご返答ありがとうございます。
えーっと…
ちょっと質問を変えます。すみません(汗

DataSourceインスタンスを取得し保持するのをJSP内ではなく、クラスで(拡張子が.class)やるとどうなるのでしょうか?

そのクラスをJSPで使いまわしにすれば、プールは保持されるのでしょうか?
よろしくお願いします。
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-09-19 08:45
引用:

DataSourceインスタンスを取得し保持するのをJSP内ではなく、クラスで(拡張子が.class)やるとどうなるのでしょうか?


servlet側でDBアクセス(その結果をjspに渡して表示)する場合ですね。
プログラムの組み方次第じゃないでしょうか。

引用:

そのクラスをJSPで使いまわしにすれば、プールは保持されるのでしょうか?


その前に、プールを保持し続けるのでしたら、そもそもプールなんて使う意味が無いと思いませんか?
おかもと
大ベテラン
会議室デビュー日: 2003/06/08
投稿数: 182
投稿日時: 2004-09-19 11:49
私もあまり詳しくないですが・・・。

引用:

aaさんの書き込み (2004-09-19 08:45) より:
その前に、プールを保持し続けるのでしたら、そもそもプールなんて使う意味が無いと思いませんか?



これは、「コネクションを保持し続けるのでしたら、
そもそもプールなんて使う意味が無いと思いませんか?」
の間違いですよね?

私は、「プール = コネクションを貯める入れ物(または仕組み)」
と理解しています。

牙狼さんは、JSP(Servlet)のインスタンスが消滅したら
「プールも消滅してしまうのでは、コネクションをプールする意味が
あまり無いのでは?」と言う疑問を持っているように感じたのですが、
もしそうであるならば、サーブレットのインスタンスは通常コンテナを
再起動したり、コンテナの管理ツールで起動・停止しない限りは
生き続けるので、通常問題無いと思います。

また、記事はDBCPを説明するためにわざと自力でプールを作成していますが、
通常はサーブレットコンテナの設定などで行うことになると思います。

質問の意図を間違っていたらごめんなさい。
aa
ぬし
会議室デビュー日: 2004/01/08
投稿数: 299
投稿日時: 2004-09-19 13:37
引用:

これは、「コネクションを保持し続けるのでしたら、
そもそもプールなんて使う意味が無いと思いませんか?」
の間違いですよね?


ああ、そうですね。ごめんなさい。
引用:

私は、「プール = コネクションを貯める入れ物(または仕組み)」
と理解しています。


ためると言うより、共有する、そして管理しているって感じでしょうかね。

100クライアントから接続されたときにDBサーバにおのおの100個のコネクションをはるのではなく、事前に10個のコネクションを確立しときますから、みんなで共有してつかいましょうね。
DBサーバとのコネクションの管理は全部お任せください。DBにアクセスしたいときだけ一時的に貸し出しますから終わったらすぐに返してください。そのかわりコネクションオープンとかクローズとかの時間も手間も必要ありません。
DBサーバから取ってみても、一度に100個のコネクションがはられる事はなく、最大10個までと制限されてますので安心です。同時に15個の要求が来ても(プーリングしてますから)私どもの方で5つは順番待ちにいたします。

っていうようなかんじでしょうか。
牙狼
会議室デビュー日: 2004/06/09
投稿数: 16
投稿日時: 2004-09-19 16:17
aaさん、おかもとさん、永井和彦さん、ご回答ありがとうございました。

んーもう少しJSPを勉強しなおしてきます。
1

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