Caching Application Data

仕事で使用しているサーバサイドのJavaフレームワークではRDBの、それも頻繁に使用するテーブルのデータをDAOもろともヒープ上に常駐させている。狙いはもちろん頻繁にアクセスするデータを操作するコストの節約だ。
Webアプリケーションのプレゼンテーションレイヤで使用しているエラーメッセージやガイダンスメッセージは数千件〜数万件に上り、全てデータベースに格納されているのでいちいちRDBにデータを取得しにいくとシステムとして実用にならないからだ。
このようなデータ操作オブジェクト(DAO)は「常駐」という言葉からResidentDAOという名前のインタフェースで以下の操作を定義されている。

public interface IResidentDao {
    public void activate() throws DaoException;
    public void refresh() throws DaoException;
    public void passivate() throws DaoException;
}	

これらはそれぞれ

  • activate() DAOのデータを使用可能にする(他の媒体に待避されたデータ又はRDBからデータを取得する)
  • refresh() DAOのデータを最新にリフレッシュする(差分データのみをRDBから取得する)
  • passivate() DAOのデータを他の媒体(ファイル等)に待避する

という振る舞いを実装する。これらは必要であればそれぞれをバックグラウンドのデーモンスレッドで一定間隔で実行することでキャッシュの内容を最新に保つこともできるだろう。


このようなインタフェースを実装するクラスを作り、インスタンスを実際にJVM上に常駐させるのに手っ取り早いのは以前の日記にも書いたようにSingletonにしてしまう事だ。サーバサイドアプリケーションであること、なんらかのサーブレットコンテナ(アプリケーションサーバ)上で動作することを想定した場合通常はそれで充分。サーバがクラスタリングされていたり一部のアプリケーションサーバのように複数のJVMを並行で動作させる事ができるような場合はJNDIや他のサービスロケータ上でパブリッシュしたりすれば良いだろう。


.NETではどうだろう。.NETのGUIアプリケーションでもJava側同様にエラーメッセージとガイダンスメッセージはRDBに登録されているデータを使用するという要件があったとする。当然ながら毎回RDBに接続してデータを取得してくる等は愚の骨頂なので同様の仕組みを.NET側にも用意しなくてはならない。
同様のインタフェースを実装するクラスをJava同様に作れば良いのだがランタイムはサーバサイドのように一つとは限らない。単純なSingletonで実装してしまうとそれこそ起動された回数分のResidentDAOを生成してしまうのでえらいことになる。
ここで以前の日記2005-03-28 - Kazzzの日記で紹介したAppDomainを跨いだSingletonを.NET Remotingで生成する方法が俄然注目となる訳だ。この方法であればResidentDAOはシステム上で只一つのインスタンスである事を保証できるのでRDBのデータのスナップショットが重複する事は通常あり得ない。
我ながら良い方法だなぁと悦に入っていると参考の為にふと覗いたMicrosoftが公開しているSmart Client Architecture and Design Guide(http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnpag/html/scag.asp)のCaching Data(http://msdn.microsoft.com/library/en-us/dnpag/html/SCAG-CH02.asp?frame=true#scag-ch02_topic2)という章で紹介されているアーキテクチャの一つがほとんど同じじゃあないですかー。


storage mechanisms are available for the caching block:

  • Singleton object
A .NET remoting singleton object can be used to cache data that can be shared across processes in one or several computers. This is done by implementing a caching service using a singleton object that serves multiple clients through .NET remoting. Singleton caching is simple to implement, but it lacks the performance and scalability provided by solutions based on Microsoft SQL Server. 

うーんやられた。