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"));
}