- PR -

セッションに登録したコネクションオブジェクトの接続プールへの返却方法について

投稿者投稿内容
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-08-29 09:37
忍者鳥取県です。

昨日下記のような質問を投げましたが、よくよくしらべてみると
javax.servlet.http.HttpSessionBindingListenerインターフェイスで
セッションタイムアウト時の終了処理valueUnboundメソッドが呼び出されて
いる時点で、すでにセッション自体無効化されていました。
ゆえに、この方法は使えないみたいですね・・・・(・_・、)グスン
お騒がしました。m(_ _)m ペコリンコ
 


引用:

セッションのタイムアウト時に
javax.servlet.http.HttpSessionBindingListenerインターフェイスを
利用して処理を行わせようとしましたが、
その際にセッションの情報からコネクションオブジェクト
をとりだし、それをクローズとしたかったのですが、
下記ソースのコネクションをセッションから抜き出す操作のところで
プログラムがうんともすんともうごかない状態になってしまいます。
エラーかともおもったんですが、エラーを出力していないので
ちがうみたいです。。

public void valueUnbound (HttpSessionBindingEvent event) {

 HttpSession hs = event.getSession();
Connection conn = (Connection) hs.getAttribute("conn");
if (conn != null) {
 try {
 conn.close();
}catch (SQLException sqle) {
System.err.println(sqle.getMessage());
}
 conn = null;
}
 System.out.println("valueUnBound");
}

コーディングを間違えているようには思えないんですが
原因が分らないのでどなたか原因がお分かりでしたら
ご指摘お願いします。

もしくはページングを行う方法でもっとよい別のやり方が
あるのでしょうか?

山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-08-29 11:14
正攻法、というか一般的なデザインパターンはものの本にたくさん書いてありますのでまずはそれらを参考にすることをお勧めいたします。

JDBCでごりごりとデータを取得したいのであれば rownum を使って必要な範囲だけをフェッチして表示すれば軽くもなるし、コネクションをセッションに放りこむ必要もないかと思います。

コネクションプールの必要性につきましては色々なところで論じられています。ご参照ください。せっかくJavaを使うのですから。Strutsにも簡単なコネクションプールが実装されていますし。
まりり
ぬし
会議室デビュー日: 2001/12/05
投稿数: 329
投稿日時: 2003-08-29 11:31
引用:

 ユーザーのアクションについてですが、ブラウザを閉じるといった動作ぐらい
だったらJAVAスクリプトでウィンドウが閉じられるといったイベントを
感知して、そのイベントをもとにセッションを閉じることは可能だと思います。
私が問題としているのはユーザ側のPCが急にダウンした際にイベントを感知できない
のでセッションのタイムアウト時になんらかの処理を施して、コネクションが
クローズできないかと言うことなのです。ユーザ側のPCが急にダウンするといった
事象自体、そうそう頻度が高く発生するとこととは思えないので、セッションのタイムアウト時に、コネクションのクローズの処理を行えれば十分対応できるのではないかと考えます。



JavaScriptではウィンドウのクローズはイベントとして拾えませんので
ご注意を。
これってみなさん結構苦労してると思いますよ。

結局、クライアントがWebブラウザになっているおかげでクライアントの
ライフサイクルの制御に苦労するよりは、リクエストごとにプールから
コネクションを借りてきてその都度SQLを投げることにしているわけです。

毎度大きなデータを取ってくるような場合にはそれこそSQLの結果を
セッションに突っ込んでおいて再利用すればよいです。
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-08-29 11:59
引用:

JavaScriptではウィンドウのクローズはイベントとして拾えませんので
ご注意を。
これってみなさん結構苦労してると思いますよ。



 下記のようなコーディングすることにより、ウィンドウの終了時に
 JavaScriptを動作させることは可能です。
 ウィンドウが閉じた際に、JavaScriptを用いてサーブレット等に
 submitを行いなんらかの処理を行わせることはできます。

<html>
<head>
<script language="JavaScript">
function a(){
alert('ひろえるよ!')
}
</script>
</head>
<BODY bgcolor="lightcyan" onLoad="alert('いらっしゃいまし(*^_^*)')"; onUnload="a()";>
あいうえお
</body>
</html>

引用:

結局、クライアントがWebブラウザになっているおかげでクライアントの
ライフサイクルの制御に苦労するよりは、リクエストごとにプールから
コネクションを借りてきてその都度SQLを投げることにしているわけです。

毎度大きなデータを取ってくるような場合にはそれこそSQLの結果を
セッションに突っ込んでおいて再利用すればよいです。



たとえば何百万件のデータをセッションに保持することになった場合
結果をセッションに登録すると相当リソースを消費してしまうような気がする
のですが、、そのWebアプリケーションを使用する人間が数人程度だったら
問題ないかもしれませんが、、、。
たしかにコーディング自体は楽でいいですよね。実をいうと私自身も最初そのような
コーディングをしていました。(・_・;)>ポリポリ

[ メッセージ編集済み 編集者: 忍者鳥取県 編集日時 2003-08-29 12:40 ]
ニシトミ
ベテラン
会議室デビュー日: 2003/04/24
投稿数: 76
お住まい・勤務地: 千葉・東京
投稿日時: 2003-08-29 13:26
どうもニシトミです


unloadイベントって、ウィンドウクローズイベントなんですか

そのページが切り替わるときに呼ばれるのかと思ってました。
イリーガルな、検証試験とかで、そのページをリロードとかしたら
例外出そうですけど
余計なお世話かもしれませんが
scriptに頼るのって結構実装依存とかになるのでは?

taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2003-08-29 13:27
引用:

忍者鳥取県さんの書き込み (2003-08-29 11:59) より:
 下記のようなコーディングすることにより、ウィンドウの終了時に
 JavaScriptを動作させることは可能です。
 ウィンドウが閉じた際に、JavaScriptを用いてサーブレット等に
 submitを行いなんらかの処理を行わせることはできます。

<html>
<head>
<script language="JavaScript">
function a(){
alert('ひろえるよ!')
}
</script>
</head>
<BODY bgcolor="lightcyan" onLoad="alert('いらっしゃいまし(*^_^*)')"; onUnload="a()";>
あいうえお
</body>
</html>


 うーん、まりりさんがおっしゃっていることが全く理解できてないですね。
それだけでは絶対に無理です。
それだと、画面が更新されたときも同じ動きをしてしまいます。
このために、判断するためのフラグを持たせるなどして、
ウィンドウが閉じられたかどうかを区別する必要があるんです。
そんな単純なことではないんですよ。
kito
ベテラン
会議室デビュー日: 2003/03/24
投稿数: 59
お住まい・勤務地: Osaka
投稿日時: 2003-08-29 13:27
引用:

忍者鳥取県さんの書き込み (2003-08-29 11:59) より:
下記のようなコーディングすることにより、ウィンドウの終了時に
JavaScriptを動作させることは可能です。


ある特定の環境では意図した通りに動くかもしれませんが、
ユーザーがJavaScriptをOFFにしていたり、挙動の違う別のブラウザを使っていたり、
ブラウザのバージョンアップやパッチ当てによってJavaScriptの動作が変わったり
、、等と考えると、システムのクリティカルな部分をJavaScriptに頼る
のは危険です。
(クライアントの環境を限定するのは良くありますが、それとは別の話です。)

引用:

たとえば何百万件のデータをセッションに保持することになった場合


それは設計が間違っています。

リクエストごとのConnectionの取得/返却は当然の前提としてあり、
(理由については皆さんが書かれている通りです。
Webでもこの件に関して様々な情報が得られます。)
その上で、
(A) (Connectionとは切り離された)データをSessionに格納する
(B) そのページでの表示に必要なデータのみを取得する
という選択肢があるということです。

私は(B)の手法を使うことが多いですが、(A)が必要になるのは、
「検索そのものに時間がかかる」「DBでは不可能なソートを実現したい」
等の場合でしょう。
検索(select)で引っかかるデータ量が多いときには(A)の手法は不適切です。
コーディングの手間云々ではないです。大して変わらないと思いますし。

引用:

忍者鳥取県さんの書き込み (2003-08-28 17:19) より:
 たびたびselect文を投げるのもDBに多量のデータが存在する場合は
 パフォーマンスが悪くなるように思うのですが、、、


それをうまくこなしてくれるのがOracle等のDBMSです。
もちろん規模によりますが、最近のDBMSで通常の用途であれば
十分な速度を得られるでしょう。
小手先の技で高速化した気分になるよりも、普通に検索した方がずっと
速くて安定していることもよくあると思いますよ。

あと、いわゆる半角カナはWebでは使わない方が良いです。

[ メッセージ編集済み 編集者: kito 編集日時 2003-08-29 13:29 ]
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-08-29 14:59
引用:

takuさんの書き込み (2003-08-29 13:27) より:
 うーん、まりりさんがおっしゃっていることが全く理解できてないですね。
それだけでは絶対に無理です。
それだと、画面が更新されたときも同じ動きをしてしまいます。
このために、判断するためのフラグを持たせるなどして、
ウィンドウが閉じられたかどうかを区別する必要があるんです。
そんな単純なことではないんですよ。



うーん、、ようするにフラグを立てればウィンドウが閉じたことを
感知させれるのでは!?ちがうんでしょうか?

(たしかに処理をJavaScriptに依存させるのは問題だと思いましたが・・)


[ メッセージ編集済み 編集者: 忍者鳥取県 編集日時 2003-08-29 15:03 ]

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