■質問日: |
2003/08/27 |
■最終更新日: |
2007/06/15 |
■質問内容: |
都道府県データのようにほとんど変化することのないマスタデータを各セッション毎に DBから読み出すのはリソースを消費します。 できれば、初回だけデータを取得しておいて、後はそのデータを使いまわしたいのですが どのようにすればよいでしょうか? |
■回答内容: |
(このTIPはStandard版のみ有効です。) マスタデータを保持するクラスを作成します。 初回のみデータを取得し、後はそのデータのXDataSourceを再利用するようにします。 ※注 ClientRowSetそのものを再利用することはやめてください。 XRowSetは各行の状態を保持しています。(現在、何行目にカーソルがあるなど) 詳細なコードは添付資料を参照してください。 Ninja-VAではWebObjectContaienrにServletContextへの参照を持たせているので、 ServletContextにDBActionTable(もしくは、そのValueCache)を格納しておいて、SmartWebObejctからそれらのValueCacheを取得するのも一つの方法となります。 |
■添付資料: |
StatusMasterCache.java /** * ステータスデータをキャッシュしておくクラス. */ public class StatusMasterCache { private static StatusMasterCache myInstance = null; private ClientRowSet rsStatus = new ClientRowSet(); private StatusMasterCache(ClientConnection conn) { try { rsStatus.setSQL( "SELECT STATUS_CODE, STATUS FROM STATUS" + " UNION SELECT '', '(全て)' FROM DUAL ORDER BY 1" ); } catch (Exception ex) { ex.printStackTrace(); } rsStatus.setClientConnection(conn); } /** * このクラスのインスタンスを生成する。 * * 一度しか呼んではいけない。 * * @param conn * @return */ public static final synchronized StatusMasterCache createInstance(ClientConnection conn) { if (myInstance != null) return null; // エラー myInstance = new StatusMasterCache(conn); return myInstance; } public static final StatusMasterCache getInstance() { return myInstance; } /** * 最新データを取得する. * * @throws DataHandleException */ public void refreshData() throws DataHandleException { this.rsStatus.setActive(false); this.rsStatus.setActive(true); } /** * このインスタンスが保持しているXDataSourceを返す. * * @throws DataHandleException */ public XDataSource getMasterDataSource() throws DataHandleException { return this.rsStatus.getDataSource(); } } ServletBase継承クラスの例 init()メソッド // ステータスマスタデータの取得 StatusMasterCache statusMaster = StatusMasterCache.createInstance(this.getClientConnection()); statusMaster.refreshData(); HtmlForm継承クラスの例 // マスタデータ用のTempRowSet public TempRowSet tmpStatus = new TempRowSet(); コンストラクタ() { try { // tmpStatus に StatusMasterCacheのXDataSourceを割り当てる。 tmpStatus.setDataSource( StatusMasterCache.getInstance().getMasterDataSource()); tmpStatus.setActive(true); } catch (DataHandleException ex) { ex.printStackTrace(); } } |