iBATIS3 と Google guice

iBATIS3 と Google guice を組み合わせたとき、
SqlSession をインジェクト対象にすると罠にはまるようにバグを
埋め込みやすくなる。これは、以下2点から言える。
(1) close() を実行した SqlSession インスタンスは使えない。
  Google guice のInjector での生成を処理する度に行い効率も悪い
(2) 2つのSqlSession 生成後、1つのSqlSession インスタンス
  テーブル更新操作をしても、もう片方のSqlSession インスタンス
  では、結果が反映されないことである。
従って、1つの SqlSession インスタンスで一連の処理を行い終了する
バッチプログラムでない限り、SqlSession をインジェクト対象にする
のは、危険であるように思える。

以下のような、プロバイダメソッドは、使うことが少ないと思う。

/*
 * SqlSession をシングルトンにする場合、SqlSession close() を呼んではいけない!
 * セッション張りっぱなしの場合しか使用できない。
 */
@Provides @Singleton
protected SqlSession providedSqlSession() throws IOException{
   SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Configuration.xml"));
   return factory.openSession();
}
/*
 * バッチSQL実行の場合
 */
@Provides
protected SqlSession providedBatchSqlSession() throws IOException{
   SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Configuration.xml"));
   return factory.openSession(ExecutorType.BATCH,false);
}

次のように、SqlSessionFactory を生成するプロバイダメソッドを使用した方が
良いだろう。



/*
 * SqlSessionFactory を生成、注入先で、SqlSessionFactory#openSession を実行
 */

@Provides
protected SqlSessionFactory providedSqlSessionFactory() 
throws IOException{
   return new SqlSessionFactoryBuilder().build(Resources.getResourceAsReader("Configuration.xml"));
}