SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

japan.internet.com翻訳記事

エンタープライズソフトウェア構成をもっとシンプルに

中央集中データベースによる設定ファイルの一括管理

ダウンロード サンプルソース (26.7 KB)

構成値を配布する

 本稿で提案する構成システムには、中央集中データベースから取得した値をローカルのクライアントサーバーに保管しておき、後からローカルで取得できるようにするための非常に簡単なキャッシュ機構が含まれています。プロセスをシンプルで柔軟にするため、図2に示す簡単なクラスフレームワークを利用することで、ローカルクライアントが中央集中データベースから構成値を読み取り、ローカルキャッシュ(Windowsレジストリ)に保管して、常に最新の値を維持できるようにします。

図2 プロパティのクラスフレームワーク: この拡張可能なクラスフレームワークで、リモートおよびローカルの両方のキャッシュに保管されているプロパティ値を管理する
図2 プロパティのクラスフレームワーク: この拡張可能なクラスフレームワークで、リモートおよびローカルの両方のキャッシュに保管されているプロパティ値を管理する

 この構成のキャッシュ戦略には重要な長所がもう1つあります。アプリケーションの始動時に中央のストレージシステムを利用できない場合、従来であれば多くのアプリケーション構成値を取得しようとしても、アプリケーションは始動しないか、不安定な状態のままかのいずれかです。そこで、持続性のあるローカルキャッシュを使うことで可用性を向上させます。

 このフレームワークの中心となるのは、クライアントアプリケーションがプロパティ値を読み取る場合に使うPropertyValueクラスです。このクラスにより、クライアントは、構成情報がリモートで管理されてローカルにキャッシュされていることを意識せずに済みます。PropertyValueクラスは、まず要求されたプロパティ値をローカルキャッシュでチェックします。値がローカルで見つかった場合は、クライアントに直ちに値を返します。見つからなかった場合は、中央のデータベースから値を取得し、ローカルに保管してから、クライアントに値を返します。

 図3に、PropertyValueクラスが使用するフローの概要を示します。

図3 プロパティ値のフローチャート: クライアントがプロパティ値を読み取ったときに生じるフロー
図3 プロパティ値のフローチャート: クライアントがプロパティ値を読み取ったときに生じるフロー

 PropertyValueクラスには、キャッシュ内の値が有効期限切れかどうかを判断するLifetimeプロパティがあります。この場合の有効期限とは、単に値を中央のデータベースから再取得する必要があることを意味します。この時効プロセスにより、社内のすべてのマシンでプロパティ値のローカルコピーに対し定期的な更新が適用されます。escPropertyValuesテーブルのValidForフィールドは、ローカルのプロパティ値を次にリフレッシュするまでの秒数を表します。クライアントが有効期限切れの値を要求すると、クラスは中央のデータベースから新しい値を取得し、ローカルの値を更新してから、クライアントに値を返します。

 中央のデータベースにアクセスできない状況に対処するため、このクラスは次のように振る舞います。

  • プロパティ値がまだローカルに保管されていない場合、PropertyValueクラスはnull値を返します。
  • プロパティ値がローカルに保管されているけれども有効期限切れの場合、PropertyValueクラスはローカルに保管されている値を返します。

 このスキームにより、データをできる限り最新の状態に維持しつつ、中央のデータベースサーバーにアクセスできない不測の事態が生じた場合もプロパティ値をできる限りローカルで取得できるようにします。

拡張性

 読者の中には、このソリューションで中央のリポジトリにSQL Serverを使用していることに異議を唱える方もいるでしょう。プロパティのローカルリポジトリとしてWindowsレジストリを使っていることに異議を唱える方はもっと多いかもしれません。個人的には、これらはストレージとしておそらく最適な万能の選択肢であると考えますが、図2に示すクラスフレームワークは、ローカルストレージにおいてもリモートストレージにおいても交換可能な互換性をサポートしています。ほとんどの場合、プロパティ値の中央リポジトリとして使用するならばSQL Serverなどのエンタープライズクラスのリレーショナルデータベースが最適な選択肢だと思われますが、サーバーでWebアプリケーションを実行することが多い場合は、ローカルストレージにASP.NETキャッシュを採用する方がよいかもしれません。

 LocalStorageClientとRemoteStorageClientに組み込まれている拡張性のメカニズムの働きはほとんど変わりません。このフレームワークは、他のローカルやリモートのストレージメカニズムをサポートするように簡単に拡張することができます。たとえば、ローカルの構成プロパティをXMLファイルに保管するとしましょう。手順は次のとおりです。

 まず、LocalStorageClientを継承する新しいクラスを作成し、LocalPropertyValue_GetLocalPropertyValue_Setという2つのmustoverride(オーバーライド必須)メソッドを実装します。これらの2つのメソッドは、PropertyValueオブジェクトをローカルで読み取り/書き込みます。ストレージにXMLファイルを使うには、XMLファイルのオープンとクローズ、XMLファイルの読み取りと書き込みなどをサポートするコードを作成する必要があります。LocalStorageClient基本クラスのBuildPropertyValueメソッドは、XMLファイルから取得した値からPropertyValueクラスを構築する場合に役立ちます。

 RemoteStorageClientで使われるメカニズムへの参照はないことに注意してください。また、ローカルに保管されている値が有効期限切れかどうかをチェックする場合に使うコードもありません。これは、PropertyValueクラスがこれらの処理を受け持つためです。プロパティ値をリモートストレージから更新しなければならない場合、PropertyValueクラスは、図3に示すように、RemoteStorageClientとLocalStorageClient間の対話を調整します。

サンプルプロジェクトを使用する

 本稿のダウンロードサンプルには、中央のSQL Serverデータベースからプロパティ値を取得して、ローカルのコンピュータのレジストリに保管する、完全に機能するプロジェクトが収められています。ローカルに保管されたプロパティ値は、escPropertyValueテーブル内のValidForの設定値に従い、SQL Serverシステムから取得した値でリフレッシュされます。

 PropertyValueクラスのGetValue共有メソッド関数の呼び出しがシステムへのエントリポイントです。GetValueには、ModuleIDと、取得対象のプロパティの名前のみを渡す必要があります。RemoteStorageClientクラスがサーバー名を取得するので、テーブルはそのサーバー名を使用してロケーションを推測することができます。システムは、要求されたプロパティの値をローカルストレージまたはリモートストレージのいずれかから取得できる場合、そのプロパティのPropertyValueオブジェクトを返します。

次のページ
テーブルにデータを設定する

この記事は参考になりましたか?

japan.internet.com翻訳記事連載記事一覧

もっと読む

この記事の著者

japan.internet.com(ジャパンインターネットコム)

japan.internet.com は、1999年9月にオープンした、日本初のネットビジネス専門ニュースサイト。月間2億以上のページビューを誇る米国 Jupitermedia Corporation (Nasdaq: JUPM) のニュースサイト internet.comEarthWeb.com からの最新記事を日本語に翻訳して掲載するとともに、日本独自のネットビジネス関連記事やレポートを配信。

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

Michael S. Jones(Michael S. Jones)

米国の医療テクノロジプロバイダ、Systems Architecture for Passport Health Communications, Inc.,の役員。同社は病院、医療クリニック、および外来診察センター間に支払人情報および患者情報を取り扱うネットワークを構築し、医療機関の収益循環プロセス...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/1794 2008/09/04 13:02

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー