论坛: ヘルプ (Thread #41761)

スコープについて (2020-01-31 15:44 by akawamoto #84226)

お世話になります。

API Docに、QueryTagは
request / page / session / application
の4つのスコープが使えるとあるのですが、以前からpageを指定すると。

「このスコープはサポートされていません。[page]」

とエラーが出ます。

使えないのでしょうか?

Ver5の時にはlocalスコープがAPIにあったようですが、そちらは廃止されたのでしょうか?

同時に多くのウィンドウを開いて処理する必用にせまられておりまして、

「画面とデータの整合性チェックでエラーが出ました。」
↑エラーを回避する方法が、スコープを切り替えることしか浮かばず、使用できるスコープが増やせないかと、質問させていただきました。
(pageスコープが使えるようになっても数は足りないのですが・・・)

スコープを切り替える以外に何か方法がありましたら教えていただきたいです。

よろしくお願いいたします。
(最后更新: 2020-01-31 15:46 by akawamoto)

回复到 #84226×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录

Re: スコープについて (2020-01-31 17:18 by chatrun #84227)

メッセージ #84226 への返信
> API Docに、QueryTagは
> request / page / session / application
> の4つのスコープが使えるとあるのですが、以前からpageを指定すると。
>
> 「このスコープはサポートされていません。[page]」
>
> とエラーが出ます。
>
> 使えないのでしょうか?

残念ながら、page は使えません。現状、JSPページ内のみで使用するケースでも、request を使用してもらっています。

>
> 同時に多くのウィンドウを開いて処理する必用にせまられておりまして、
>
> 「画面とデータの整合性チェックでエラーが出ました。」
> ↑エラーを回避する方法が、スコープを切り替えることしか浮かばず、使用できるスコープが増やせないかと、質問させていただきました。

少しややこしいのですが、上記エラーは、
① query タグで、データをセレクトして、DBTableModel を作成する。(scope=sesshion に登録)
② 作成した DBTableModel内に、CONSISTENCY_KEY を設定する。
③ viewタグで、DBTableModel を表示するとともに、hidden でCONSISTENCY_KEY をHTML上に出す。
④ 追加、変更ボタンで、次のページに移る。
⑤ entryタグで、DBTableModel 内のCONSISTENCY_KEY と、hidden で飛んできたキーを比較する。
⑥ 不一致の場合、整合性チェックでエラーメッセージを出す。

つまり、query と、view 間で、一旦リクエストが止まり、ユーザー操作により、メモリ内の DBTableModel に
書き込み処理を行う前にチェックしていますので、scope="session" でないと、チェックは有効になりません。

scope="request" を使う限り、上記エラーが出ないことになります。

※ resuest や page では、DBTableModel が消えてしまい、次の操作はできなくなります。

> スコープを切り替える以外に何か方法がありましたら教えていただきたいです。

つまり、複数の scope="session" を使う query が存在している…みたいな状況になっていると思われます。

例えば、同じ画面を使用する場合、先のDBTableModel が同じsessionメモリ上に登録されますが、
片方でquery 別でもう一度query などを実行すると上書きされてしまいます。
そうなると、先の整合性エラーが発生しますし、当然正常に書き込めなくなります。

そこで対応方法ですが、
【1】登録する必要のないquery と view は、scope="request" にする。
検索のみの画面や、ポップアップ系でも、選択値を戻すだけの場合。
【2】登録する画面を開く場合、tableId をセットする。
scope="session" で、DBTableModel を登録する際のキーを、デフォルトから変えます。

【2】を簡単に説明すると、sessionに登録するDBTableModel は、デフォルトのキーで、登録されます。
なので、検索都度、前のオブジェクトは参照がなくなり GC の対象になります。
よって、次々に検索してもメモリは圧迫されますが、GCが働けば元に戻ります。
tableId は、sessionに登録するDBTableModel の登録キーを指定しますので、このキーで、削除しない限り、
そのユーザーがログイン状態の間中、参照が残り、GC対象になりません。
つまり、簡単なメモリリークの状態になります。

弊社では、ポップアップと 3画面(result.jsp を左右分割して、3画面にしている)があり、tableId を、
POPUP と TABLE2 みたいに、同時に使用するキーワード分だけ用意しています。
POPUP というキーを同じにしているため、別の画面でポップアップを上げれば、先の画面の検索結果が
GC対象になるので、気持ち、メモリをセーブしていることになります。

現在、このメモリを削除する方法はありません。
あえて言うなら、POPUP で使ったキーで、POPUP画面を閉じたときに、同じキーで、select 1 from dual 的に
小さい DBTableModel を作成すれば、先に作成したメモリが GC対象になるということです。

当然、session なので、ログインユーザー単位にメモリが確保されるので、tableId の種類が多いほど、
ユーザー数 × tableId の種類 × maxRowCount(最大検索件数)× カラム数 ・・・
が、ユーザーの滞在時間(セッションタイムアウト:MAX_INACTIVE_INTERVAL)分だけ残るので
結構メモリを圧迫します。

tableIdのご使用に際しては、ご注意ください。

回复到 #84226

回复到 #84227×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录

Re: スコープについて (2020-01-31 17:28 by chatrun #84228)

>
> tableIdのご使用に際しては、ご注意ください。
>
書き忘れです。

通常、query タグも view タグも、その他各種タグは、session 上の DBTableModel を、デフォルトキーで
取得しています。
これを、tableId で変えるのですから、当然取り出し側も、tableId を指定しなければいけません。

tableId 属性を持っているタグすべてに、query で指定した値を設定しておかないと、うまく動作しません。

例: columnCheck , columnEditor , entry , query , tableUpdate , view
回复到 #84227

回复到 #84228×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录

Re: スコープについて (2020-01-31 17:51 by akawamoto #84229)

メッセージ #84228 への返信
> > tableIdのご使用に際しては、ご注意ください。
> >
> 書き忘れです。
>
> 通常、query タグも view タグも、その他各種タグは、session 上の DBTableModel を、デフォルトキーで
> 取得しています。
> これを、tableId で変えるのですから、当然取り出し側も、tableId を指定しなければいけません。
>
> tableId 属性を持っているタグすべてに、query で指定した値を設定しておかないと、うまく動作しません。
>
> 例: columnCheck , columnEditor , entry , query , tableUpdate , view
了解しました。
tableidを使ってPGするようにしてみます。

ありがとうございました!
回复到 #84228

回复到 #84229×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) 登录