調査の経緯は色々あるのだが、とあるJavaのアプリケーションにおいて、iBATISが大量のメモリを使っているという疑惑があった。iBATISが?そこで、iBATISが、どの程度メモリ(ヒープ領域)を用いるのか、調査してみた。
まずは、iBATIS(今回はJava版のみを対象とする)について簡単に説明するとともに、用語について整理しておく*1。
iBATISは、データベースアクセスを行うための、シンプルなフレームワークである。シンプルがゆえに、けっこう使われている(少なくとも自分のまわりでは)と思う。
iBATISでは、「SQLマップファイル」と呼ばれるXMLファイルに、テーブルとJava Beanのマッピング、および発行するSQL文を記述*2しておく。これで、データベースアクセスオブジェクト(以下、DAO)から、設定したSQL文を発行し、結果を取得できる。
テーブルに対する単純なCRUDの機能を提供するような場合には、一般的には、1つのテーブルにつき、1つのSQLマップファイルを作成する。iBATISに読み込ませるSQLマップファイルを記述する設定ファイルを、「SQLマップ設定ファイル」(例えば、sqlmap-config.xml)と呼ぶ。
iBATISには「SQLマップクライアント」という重要なインスタンスが存在する(実体は、SqlMapClientインターフェースを実装したSqlMapClientImplクラスのインスタンス)。このインスタンスは、シングルトンであり、トランザクションの管理、SQL文の発行と結果の取得などを行う。各々のDAOは、SQLマップクライアントに処理をお願いする。
SQLマップクライアントは、SQLマップクライアントビルダ(SqlMapClientBuilder)によって生成される*3。SQLマップクライアントビルダが、SQLマップ設定ファイルを読み込み、そこに書かれているSQLマップファイルを読み込んで、SQLマップクライアントのインスタンスを生成する。
ここまでを図に表すと、次のようになる。
これで、説明はおしまい。
なお、SQLマップクライアントは、実際には次の図(オブジェクト図)のようになっている。SqlMapExecutorDelegateクラスのインスタンスがSQLマップファイルのパース結果を保持しており、SQLを発行する*4。
このあたりのクラス図を作成してみたので、参考までに示しておく*5。左下のDAOが、開発者が作成するインターフェースとクラスである。iBATISは通常、Spring Frameworkと一緒に用いるため、Spring FrameworkからSQLマップクライアントを用いるための便利クラスであるSqlMapClientDaoSupportクラスを継承している。
今日は、iBATISの紹介だけになってしまった。
まぁ、そんなものだ。無理しない。
2010/07/06追記
今さらではあるが、「iBATISはどのくらいメモリを使うのか(2)」に調査方法を、「iBATISはどのくらいメモリを使うのか(3)」に調査結果を掲載した。