iBATISはどのくらいメモリを使うのか(1)

調査の経緯は色々あるのだが、とある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)によって生成される*3SQLマップクライアントビルダが、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)」に調査結果を掲載した。

*1:iBATISの基本的な仕組みは、こんなもの。初めてiBATISに触れた時に、こんな説明があってほしかったと思うことを、極めて簡潔に書いてみた。

*2:プレースホルダの記述方法などは、iBATIS固有のものであるが、SQL文自体は自由に書ける。もちろん、データベースエンジン依存になってしまうが、、データベースエンジンにあわせた細かいチューニングが可能である。

*3:実際の処理は、SQLマップ設定パーサ(SqlMapConfigParser)が行う。

*4:ドキュメンテーションコメントには「The workhorse that really runs the SQL」とあるw

*5:そういえば、iBATISのクラス図って見たことないなぁ。意外に貴重かもしれない。