- PR -

サーブレットのタイムアウトってできますか?

投稿者投稿内容
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2003-12-01 17:05
やりたいこと:
----------------------------------------------------------------------------
 ・クライアントのVBアプリケーションからサーブレットにメッセージを送信する
 ・サーブレットから、メッセージで指定されたビジネスロジックのメソッドを
  呼び出す
 ・メソッドでは、メッセージに従ってOracle9iに対しSELECT/INSERT/UPDATE/DELETE
  を発行する
 ・結果をクライアントに返し、表示させる
----------------------------------------------------------------------------

なんですが、
ビジネスロジックの処理時間が一定時間を超えてしまった場合、処理を
中断させ、必要ならばロールバックを行いたいのですが、メソッドの
外から処理を中断させることなんてできるのでしょうか。

いろいろと資料を検索したり、識者に当たってみたりしましたが、よい
解決方法が見つかりませんでした。

よい方法をご存知の方がいらっしゃいましたら、どうかよろしく
お教えください。
永井和彦
ぬし
会議室デビュー日: 2002/07/03
投稿数: 276
お住まい・勤務地: 東京都
投稿日時: 2003-12-01 17:21
引用:

たーぞうさんの書き込み (2003-12-01 17:05) より:
やりたいこと:
----------------------------------------------------------------------------
 ・クライアントのVBアプリケーションからサーブレットにメッセージを送信する
 ・サーブレットから、メッセージで指定されたビジネスロジックのメソッドを
  呼び出す
 ・メソッドでは、メッセージに従ってOracle9iに対しSELECT/INSERT/UPDATE/DELETE
  を発行する
 ・結果をクライアントに返し、表示させる
----------------------------------------------------------------------------

なんですが、
ビジネスロジックの処理時間が一定時間を超えてしまった場合、処理を
中断させ、必要ならばロールバックを行いたいのですが、メソッドの
外から処理を中断させることなんてできるのでしょうか。

いろいろと資料を検索したり、識者に当たってみたりしましたが、よい
解決方法が見つかりませんでした。

よい方法をご存知の方がいらっしゃいましたら、どうかよろしく
お教えください。




ただの思いつきですが、Servletの方のロジックで……

1. トランザクション開始時点のSystem#currentTimeMillis()を取得
2. SQL発行して、結果が返ってきたときに、System#currentTimeMillis()を実行して
 経過時間を調査。必要ならばロールバック

では、駄目なのでしょうか?
#横から割り込む方法はちょっと思い付かなかったので……
##複数スレッドで同一のConnectionを共有して、横からRollBackしたらどうなるんだろう


[ メッセージ編集済み 編集者: 永井和彦 編集日時 2003-12-01 17:25 ]
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2003-12-01 17:40
さっそくレスいただきまして有り難うございます。
引用:

永井和彦さんの書き込み (2003-12-01 17:21) より:
ただの思いつきですが、Servletの方のロジックで……

1. トランザクション開始時点のSystem#currentTimeMillis()を取得
2. SQL発行して、結果が返ってきたときに、System#currentTimeMillis()を実行して
 経過時間を調査。必要ならばロールバック

では、駄目なのでしょうか?


ん〜やっぱりその方法しかないでしょうか・・・。
他に、ビジネスロジッククラスのインスタンスをあぼーんしてしまう、なんてことができないだろうかと考えてみたりもしたのですが。

引用:

永井和彦さんの書き込み (2003-12-01 17:21) より:
##複数スレッドで同一のConnectionを共有して、横からRollBackしたらどうなるんだろう



それはロールバックかかるかも知れませんね。でもどうやって複数スレを^^;

[ メッセージ編集済み 編集者: たーぞう 編集日時 2003-12-01 17:42 ]
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-12-01 17:55
ビジネスロジックを EJB(SessionBean) に記述していればトランザクションのタイムアウト時にロールバックされます。
たーぞう
ぬし
会議室デビュー日: 2003/08/08
投稿数: 317
お住まい・勤務地: お花畑
投稿日時: 2003-12-01 22:13
引用:

インギさんの書き込み (2003-12-01 17:55) より:
ビジネスロジックを EJB(SessionBean) に記述していればトランザクションのタイムアウト時にロールバックされます。



エエそれが・・・
EJBで動作させる場合と非EJBで動作させる場合と両方やりたい、という
要求なんです。^^;

非EJBで動作させたいというビジネスロジックが、既に8000本ぐらいあり
まして、それをEJBに変換するというのも大変な話なので。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2003-12-02 07:46
おそらく処理に時間がかかるのはDBMSの処理でしょうからJDBCでタイムアウトするように記述するようにしてはいかがでしょうか。
忍者鳥取県
ベテラン
会議室デビュー日: 2003/08/28
投稿数: 61
お住まい・勤務地: リオネジャネイロの地下6000Km
投稿日時: 2003-12-02 13:24
「ベテラン」と言う表示になってますが・・・結構初心者です・・(・_・;)(汗)

これでいいのか自信がありませんが、
セッションの取得を行い、セッションのタイムアウト時に
HttpSessionBindingListenerインターフェースのvalueUnboundメソッドの中に
中断するための処理を記述してはいかかでしょうか?

http://www.ingrid.org/jajakarta/servletapi/servletapi-4.0/docs-ja/javax/servlet/http/HttpSessionBindingListener.html
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2003-12-02 20:28
>セッションの取得を行い、セッションのタイムアウト時に
>HttpSessionBindingListenerインターフェースのvalueUnboundメソッドの中に
>中断するための処理を記述してはいかかでしょうか?
リクエストの処理中にセッションがタイムアウトすることはないと思いますので、valueUnbound が呼び出されることはないでしょう。それにセッションのタイムアウトって30分とか、1時間とかいう単位で設定しますから、今回のケースのタイムアウト時間としては長すぎると思います。

Anthyhime さんのおっしゃるようにサーブレットから切り離して考えて、JTA なり JDBC でタイムアウトさせるのが良いかと。

[ メッセージ編集済み 編集者: インギ 編集日時 2003-12-02 22:32 ]

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