MyBatisのSqlSessionFactory構築メカニズム

MyBatisフレームワークにおいて、SqlSessionFactoryは最も重要なコンポーネントの一つであり、SqlSessionインスタンスを生成するためのファクトリです。SqlSessionはデータベースとのやり取りを行う主要なインターフェースであり、SQL実行やトランザクション管理を担当します。

SqlSessionFactoryの生成プロセスは主にSqlSessionFactoryBuilderクラスによって処理されます。このビルダークラスはビルドパターンを採用しており、XML設定ファイルやJavaコードによる設定など、さまざまなソースからSqlSessionFactoryを構築するための複数のメソッドを提供しています。

SqlSessionFactory構築の主要な手順

1. 設定情報の取得

SqlSessionFactoryの生成前に、MyBatisの設定情報をロードして解析する必要があります。設定情報は以下の形式で提供されます:

  • XML設定ファイル(mybatis-config.xmlなど):最も一般的な方法で、グローバル設定、データソース、トランザクションマネージャ、Mapperマッピングファイルなどを定義します。
  • Javaコードによる設定:Configurationオブジェクトを直接構築し、各種パラメータを設定します。
  • Springとの統合:SpringコンテナがSqlSessionFactoryのライフサイクルを管理します。

2. SqlSessionFactoryBuilderによる構築

SqlSessionFactoryBuilderは複数のbuild()メソッドを提供しており、異なる設定ソースに対応しています。最も一般的なのはInputStreamを引数に取るメソッドです。

XMLファイルからの構築(一般的な方法):

String configPath = "mybatis-configuration.xml";
InputStream stream = ResourceLoader.loadResource(configPath);
SessionFactory factory = new SqlSessionFactoryBuilder().build(stream);
  • ResourceLoader.loadResource():クラスパスからリソースを読み込むユーティリティメソッド
  • SqlSessionFactoryBuilder().build():入力ストリームを受け取って構築処理を実行

Configurationオブジェクトからの構築:

DatabaseConfig dbConfig = new DatabaseConfig();
// dbConfigを使用して各種設定を適用
// dbConfig.setRuntimeEnvironment(runtimeEnv);
// dbConfig.registerMapper(UserRepository.class);

SessionFactory factory = new SqlSessionFactoryBuilder().build(dbConfig);
  • DatabaseConfigオブジェクトを作成し、APIメソッドで設定を適用
  • build()メソッドに設定済みオブジェクトを渡す

3. XML構築時の内部処理

SqlSessionFactoryBuilder.build(InputStream)メソッドは以下の内部処理を実行します:

3.1. XML設定パーサーの初期化

XmlConfigurationParser parser = new XmlConfigurationParser(inputStream);

XmlConfigurationParserはXML設定ファイルを解析する専用クラスです。

3.2. XML解析とConfigurationオブジェクトの構築

DatabaseConfig config = parser.parse();

解析プロセスでは以下の要素が処理されます:

  • <database>ルート要素の解析
  • <connection-properties>要素:外部プロパティファイルの読み込み
  • <global-settings>要素:キャッシュ設定、遅延ロード、ログ設定など
  • <type-mappings>要素:型エイリアスの定義
  • <converter-registrations>要素:カスタム型変換器の登録
  • <interceptor-plugins>要素:プラグイン(インターセプター)の登録
  • <runtime-environments>要素:実行環境の設定
    • <runtime-env>要素:トランザクションマネージャとデータソースの設定
  • <mapping-registrations>要素:Mapperマッパーの登録
    • XMLマッパー:XmlMapperParserを使用してSQLマッピングを解析
    • インターフェース:動的プロキシ生成のために登録

3.3. ファクトリインスタンスの生成

return construct(config);

解析されたDatabaseConfigオブジェクトを基に実際のファクトリインスタンスが作成されます。

3.4. インスタンスの返却

private SqlSessionFactory construct(DatabaseConfig config) {
  return new DefaultSessionFactory(config);
}

DefaultSessionFactorySqlSessionFactoryのデフォルト実装で、DatabaseConfigオブジェクトを保持しながらSqlSessionインスタンスの生成を担当します。

4. SqlSessionFactoryのライフサイクル管理

SqlSessionFactoryはアプリケーション全体のライフサイクルを通じて存続すべきです。アプリケーション起動時に一度だけ生成し、シングルトンとして管理することが推奨されます。Spring環境では通常、SpringコンテナによってBeanとして管理されます。

構築プロセスの要約

  1. MyBatis設定情報のロード(XMLまたはJavaコード)
  2. SqlSessionFactoryBuilderインスタンスの生成
  3. 設定情報(InputStreamまたはConfiguration)を引数にbuild()メソッドを呼び出し
  4. 内部処理:
    • XML構成の場合:XmlConfigurationParserの生成
    • XML解析とDatabaseConfigオブジェクトの構築
    • DatabaseConfigを使用したDefaultSessionFactoryの生成
  5. SqlSessionFactoryインスタンスの返却

SqlSessionFactoryの重要性

  • SqlSessionファクトリ:すべてのSqlSessionインスタンスの生成元
  • 設定の中心:DatabaseConfigオブジェクトを内部に保持し、すべての設定情報を管理
  • パフォーマンス向上:生成コストが高いため、シングルトンとして再利用することで効率化
  • スレッド安全性:スレッドセーフなファクトリと非スレッドセーフなセッションの分離により、並列処理に対応

タグ: MyBatis sqlsessionfactory database-configuration xml-parsing java-framework

8月2日 20:18 投稿