- PR -

サーブレットからDBに通信していると、ブラウザ(IE)が真っ白になってしまいます(T_T)

1
投稿者投稿内容
くえるぼ
会議室デビュー日: 2004/12/15
投稿数: 16
投稿日時: 2005-11-24 14:40
現在以下の環境でデータベースに問い合わせを行うプログラムを書いています。

Tomcat:3.2.4
Oracle:9iR2
Java:JDK1.3
Ant:1.5
SQL.Statement.setQueryTimeOut:7200sec(2時間)
Web.xmlのsession-time out:120min(2時間)
IE:6.0.2900
Netscape:7.1

現状、特定のケースにおいてSQLの処理自体1時間以上かかります。
このような状況において、IEでSQLのexucuteを行うと、
なぜかちょうど1時間経ったところで、IEの画面が真っ白になってしまい、
しばらく待つとIEの”ページを表示できません”というエラー画面が
返ってきてしまいます。

SQLで設定したタイムアウト時間は2時間、Tomcatのセッションタイムアウトも
2時間を設定しているので、2時間までは処理可能なはずなのですが、
なぜかどこにも設定をしていないはずの、1時間後に画面が真っ白に
なってしまいます。
また、その際なぜか一度問い合わせをかけたSQLが全く同じ条件で
再度実行されています。。。

しかも、とても不思議なのはこの現象はIEではほぼ100%再現できるのですが、
NetscapeやFireFoxでは、発生しません。

いろいろと書籍、インターネットサイトを調べてみたのですが
ハッキリとしたことが分からなかったので質問させていただきました。
何かお気づきの点等ありましたら、アドバイスよろしくお願いいたします。


K
大ベテラン
会議室デビュー日: 2004/04/07
投稿数: 174
投稿日時: 2005-11-24 14:43
おそらくIE自身のタイムアウトではないでしょうか?

WEBアプリケーションで応答が帰ってくるまで二時間というのは現実的ではないので、
DBの処理に時間がかかるようであればサーブレット側で非同期呼び出しにして画面への
応答(「現在処理中です」などの)はすぐにかえしてあげたほうがよいと思いますよ。
くえるぼ
会議室デビュー日: 2004/12/15
投稿数: 16
投稿日時: 2005-11-24 14:54
引用:

mogeさんの書き込み (2005-11-24 14:43) より:
おそらくIE自身のタイムアウトではないでしょうか?

WEBアプリケーションで応答が帰ってくるまで二時間というのは現実的ではないので、
DBの処理に時間がかかるようであればサーブレット側で非同期呼び出しにして画面への
応答(「現在処理中です」などの)はすぐにかえしてあげたほうがよいと思いますよ。



moge様
早速の回答ありがとうございます。
2点ほど、質問させていただけますでしょうか。

1つめ:IEのタイムアウトについて
IEのタイムアウトは、どういったパラメータで設定されているのでしょうか。
ユーザー側、またはアプリ(Java)側から制御可能なものなのでしょうか。

2つめ:非同期呼び出し
知識不足で申し訳ないのですが、非同期呼び出しというのは
サーブレットからデータベース問い合わせ部分は別スレッドとしてRunし、
元々のスレッドはJSPにForwardするということになりますでしょうか?
なお、データベース問い合わせ部分ですが、問い合わせが終了した後
ユーザーに対して、結果を提示する(メッセージボックスを出し、ダウンロード
してもらう)ことを考えておりますが、その際も問題はないでしょうか。

いろいろとご質問させていただき、もうしわけありません。
m(_ _)m


さぷり
会議室デビュー日: 2005/11/18
投稿数: 18
投稿日時: 2005-11-24 14:55
こんにちわ。

引用:

mogeさんの書き込み (2005-11-24 14:43) より:
おそらくIE自身のタイムアウトではないでしょうか?



mogeさんのおっしゃっているとおり、IE自身のタイムアウトのようですね。
下記のサイトで記載されていますが、タイムアウト時間はIE 5.xおよび6の場合は
60分だそうです。
http://support.microsoft.com/default.aspx?scid=kb;ja;181050
さぷり
会議室デビュー日: 2005/11/18
投稿数: 18
投稿日時: 2005-11-24 22:00
引用:

JAVAビギナー(+_+)さんの書き込み (2005-11-24 14:54) より:
2つめ:非同期呼び出し
知識不足で申し訳ないのですが、非同期呼び出しというのは
サーブレットからデータベース問い合わせ部分は別スレッドとしてRunし、
元々のスレッドはJSPにForwardするということになりますでしょうか?
なお、データベース問い合わせ部分ですが、問い合わせが終了した後
ユーザーに対して、結果を提示する(メッセージボックスを出し、ダウンロード
してもらう)ことを考えておりますが、その際も問題はないでしょうか。



DB処理を別スレッドの非同期処理とした場合、いつ処理が終了したかわからないので、DB処理完了をハンドリングする
ロジックを組んで完了していたらダウンロード処理を行うように実装する必要があると思います。
(※他に方法があるかもしれませんが。。。)

今流行りのAjaxなんて技術を使っても良いかもしれません。
Ajaxを使うとしたら、以下の手順ですかね。
1.XmlHttpRequestでrequestを投げDB処理を行う。
2.画面は「DB処理中」などのメッセージを表示させておく。
3.レスポンスが返ってきたら、ダウンロード処理を行うservletに対してsubmitをかける。

Ajaxの実装方法については、googleなどで検索すればヒットすると思います。
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2005-11-24 22:20
2時間以上画面を開いたまま放置しなければいけない設計が問題に感じます。

・非同期での実行中は、ダウンロード用の画面はフラグで判定してブロック
・完了後にダウンロード用画面を表示する

や、さぷりさんの案など、色々方法があると思いますが、
ブラウザにタイムアウトされない事を期待するのではなく、
運用方法でカバーすべきではないでしょうか。
くえるぼ
会議室デビュー日: 2004/12/15
投稿数: 16
投稿日時: 2005-11-25 10:32
皆様丁寧なアドバイスありがとうございます。
かつのりさんのご指摘にありましたとおり、設計自体に
問題があるという点痛切に受け止めております。

今後は皆様から頂いたアドバイスを元に、問題に対処
していきたいと思います。

この度は誠にありがとうございました。
1

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