■質問日: |
2008/05/22 |
■最終更新日: |
2008/05/22 |
■質問内容: |
ClientRowSetで、データベースからデータを取得後、データを(メモリから)解放する 方法はありますか? DBからデータを取得/編集して処理終了後、ClientRowSetの内容を解放したいのですが、 取得したデータ分メモリを消費したままになっているようです。 |
■回答内容: |
まず、HtmlForm側のプログラムとして、下記のようにClientRowSetの データを破棄します。 rs.setActive(false); rs.setDataSource(null); しかしながら、これだけではClientRowSetの実データはGC対象と なりません。 ClientRowSetが参照しているXDataSource(実データ)は、 QueryActionからも参照されています。 QueryActionが消滅しない限り、GC対象とはなりません。 ClientRowSetとQueryActionとの関係図は、下記をご覧ください。 http://www.tenartni.com/man/wdc/130se/WDC_DEV.pdf#page=39 概略図 1.ClientRowSetでsetActive(true)を行なった直後 QueryAction | | 参照 V ClientRowSet ======> XDataSource (実データ) 参照 (ClientRowSetとQueryActionの両方から実データへの参照があります。) 2.ClientRowSetでsetActive(false)およびsetDataSource(null)を行なった直後 QueryAction | | 参照 V ClientRowSet XDataSource (実データ) (ClientRowSetからの実データへの参照はなくなりますが、 QueryActionからの参照が残っています。) XDataSouce(実データ)を解放するには、QueryActionインスタンスを 削除する必要があります。 QueryActionインスタンスは、次の場合に削除されます。 (A) コネクションプールの縮小が起こった場合 (B) 再度、ClientRowSetからの呼び出しがあった場合 あるいは、 (C) QueryActionインスタンスを最初からメモリ上に残さない という方法でXDataSouce(実データ)を解放する方法もございます。 各方法の詳細です。 (A) コネクションプールの縮小を起こす web.xml内にdb_min_agentの値を0と明示することで、 定期的にコネクションプールの縮小が起こります。 (2分毎にチェックが行なわれ、その際、1分以上未使用の コネクションは破棄されます。 つまり、GC対象となるまでに最大3分かかる場合があります。) (B) ClientRowSetからの呼び出し この方法を使っての、XDataSouce(実データ)の解放は推奨 いたしません。 ClientRowSetからの呼び出しを行なうことで、別のXDataSouce(実データ) がメモリ上に残ります。 (C) QueryActionを最初からメモリ上に残さない QueryActionのインスタンスをキャッシュしないよう、システムプロパティを 設定します。詳細は、下記のAPIドキュメントを参照してください。 (WDC 1.30-010より利用可能です。) http://www.tenartni.com/man/wdc/130se/api/jp/co/tenartni/WWBSystemProperty.html#QUERY_ACTION_CACHE (A)と(C)の違いは、QueryActionのインスタンスを保持しておく時間です。 (A)の場合は、最大約3分間、QueryActionのインスタンスを保持しておきます。 (C)の場合は、QueryAction呼び出し終了後に破棄します。 例えば、検索画面で、 検索条件1で検索実行 検索条件2で検索実行 検索条件3で検索実行 というような操作を短時間(1分程度)で行なった場合、下記のような 違いがあります。 (A) QueryActionインスタンスは初回のみインスタンス化され、 2回目、3回目の検索ではキャッシュされているものを利用する。 (C) QueryActionインスタンスは毎回インスタンス化される。 その分、2回目、3回目の処理は、(A)よりも遅くなる。 ※注 ClientRowSetをHtmlTableHandlerのDataHandlerに設定している場合は 上記の作業を行っても、メモリから解放されません。 HtmlForm.removeAllDataSources()メソッドを呼び出す必要があります。 ただし、この場合、HtmlFormが所有している全てのXDataSource(実データ) が解放されます。 HtmlFormの使用を終えた場合などに呼び出してください。 |
■添付資料: |
なし |