- - PR -
セッションに登録したコネクションオブジェクトの接続プールへの返却方法について
| 投稿者 | 投稿内容 | ||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2003-09-02 10:44
DBコネクションというリソースをシステム側できっちりハンドリングできないからじゃないですか? 以前、
とおっしゃっていますが、そのこと自体は、
の解決策にはなっていないですよね。 コネクションをクライアント側に預けてしまって、それでいてクライアントに使用するコネクションの数を(ひとつに)制限すること、およびコネクションを閉じることを強制する術がないとすれば、それだけで十分な理由だと思いますよ。 [ メッセージ編集済み 編集者: swat 編集日時 2003-09-02 10:46 ] | ||||||||||||
|
投稿日時: 2003-09-02 10:51
確かに たーぞうさんのおっしゃることもよく分ります。 しかし、それでは前にも述べました select文とselect文との間に 更新処理が入ると、整合性がとれないといった問題が生じてきます。 まーそれぐらい許容して、レスポンスをとるといった選択肢もあると思いますが、 そこらへんは、そのアプリケーションごとにあった方法を とっていくのがベストでしょう。 前にも述べましたが、私が作成してるWebアプリケーションの ピーク時に予想されるアクセス数分だけ、コネクションをプール させるように設定しますので、レスポンスもそこまで 問題にならないかと考えます。 | ||||||||||||
|
投稿日時: 2003-09-02 11:04
なるほど。でもまた
ともおっしゃっておられますよね。 それじゃいっそのこと最初のselectで得たデータをセッションオブジェクトで保持しておいたらいかがですか?ただし今度はセキュリティ上の問題が発生し得ますが・・・ | ||||||||||||
|
投稿日時: 2003-09-02 11:08
このスレッドの2ページ目を見ていただけると分ると思いますが、 コネクションをクライアント側にあずけるのではなくて、サーバ側で セッションのタイムアウト時にコネクションをクローズするように することができます。 『確かにJavaScript云々の話は私が 間違っていたと思います。m(_ _)mペコリンコ』 | ||||||||||||
|
投稿日時: 2003-09-02 11:13
このスレッドで前にも述べましたが、その場合だとselectを投げた結果として 多量のデータが存在した場合、セッションに多量のデータが格納されることにより 相当リソースを消費してしまうと考えられます。 [ メッセージ編集済み 編集者: 忍者鳥取県 編集日時 2003-09-02 11:14 ] | ||||||||||||
|
投稿日時: 2003-09-02 11:18
名指しですか(^^ もう皆さんがだいたい回答しちゃってますよね。 だから後から私が回答することでも無いと思いませんか? 私が終業直前に書き込みをして、次の日に見たら、 だいたい回答されていましたから(^^ 流れを見たら解かってもらえませんかね。 しょうがないので、私が心配していることをちょっと書きますね。 例えば、メモリーリークは大丈夫ですかね。 DBのクローズをしっかりしないだけでも、 メモリーリークが生じることがあるんですが。 私が携わったことがあるプロジェクトで、 サーバーがメモリーリークでダウンしたことがあります。 だいたい、ステートレスなHTTPでクライアントとサーバー間の通信を行うのに、 サーバーとDBとの通信だけ維持するのはおかしいと思いませんか? | ||||||||||||
|
投稿日時: 2003-09-02 11:32
クライアントに預ける、という書き方は観念的だったかもしれませんね。すみません。 セッションタイムアウト時のクローズはいいんですが、結局のところ、ユーザ数=コネクション数(セッション数といったほうがいいでしょうか)とはなりませんので、いくら設定をユーザ数と同じにしたとしても、枯渇の問題は避けられないかと思いますよ。 たとえば、一人のユーザがブラウザを開いてログイン、検索処理をして、ログアウトをせずブラウザを閉じ、またブラウザを開いてログイン・・・・ということを10回も繰り返せば、サーバ側には、一人のユーザに対して、10個のsessionオブジェクトができ、それぞれに対して、1つずつのDBコネクションがオープンしたまま保持され、それはタイムアウトするまで、クローズされることがない・・・ということになりますよね。 アクセスピーク時のユーザ数=コネクションプール設定数としていると、アクセスピーク時には、たった一人でもログアウトせずにブラウザを閉じ、再ログインしようとして段階で、枯渇してしまうと思います。 したがって、コネクションプールの設定数が十分だからといって、問題は解決しないと思います。 #個人的には、こういう設計って、コネクションをプールしてることにならないし、リソースをプレゼンテーション層まで引き上げちゃってるし、ステートレスな通信にステートフルな通信を保持しようって言う時点であまり好きじゃないですね。 [ メッセージ編集済み 編集者: swat 編集日時 2003-09-02 12:07 ] | ||||||||||||
|
投稿日時: 2003-09-02 11:34
最初の方でukさんやHushさんが指摘しておられますよ。 各所で語り尽くされている話題なのでここで繰り返すのもアレですが(^^; サーバーにリクエストを投げるだけでセッションは作られますから、 一般には(セッション数 > DB同時接続数)とします。 セッションにDB接続を関連付けてしまうと、1セッションに付1接続必要です。 500回リクエストを投げれば500セッションが生成され、DB接続も500本作られますよね。 DB接続数にあわせてセッション数を減らす?→本当に利用したいユーザーが利用できないですね。 セッション数にあわせてDB接続を増やす?→DBサーバーのリソースを無駄に消費しますね。 悪戯も簡単ですね。WebブラウザからならCookieをOFFにしてリロードを繰り返しましょうか。 DB接続だけ見ても、同時接続数が増えるとライセンス料が高くなったり、 そもそも何百もの接続してDBサーバーは大丈夫?という話にもなります。 どこからも使われないDB-Connectionが大量にほったらかしてある、って感じですかね。 DB接続って貴重なリソースなんですが、もったいないですね(^^) HttpSessionBindingListenerを調べたとき見つけたのですが、 Servlet/JSPのセッションとリソース管理について http://www.seraphyware.jp/dev/tips/java.tips.session.html のページなどは注意点が良くまとまっていて良いと思いました。
そういう要件が本当に必要なら、その点だけ解決すれば良いのではないですか? 既に書きましたが、(そういう動作が適当かどうかは別として、)実現方法はありますよ。 | ||||||||||||
