myBatis 3の範囲とライフサイクル

1994 ワード

myBatis 3の範囲とライフサイクル
-----------
 
 
現在議論されている異なる範囲とライフサイクルのクラスを理解することが重要です.正しく使用しないと、深刻な同時問題が発生します.
 
1.SqlSessionFactoryBuilder 
このクラスはインスタンス化され、使用され、破棄されます.SqlSessionFactoryを作成すると、このクラスは存在しなくなります.したがって、SqlSessionFactoryBuilderインスタンスの最適範囲はメソッド範囲である.
 
2.SqlSessionFactory 
作成されると、SqlSessionFactoryはアプリケーションの実行中に存在するはずです.処理または再作成する理由はありません.SqlSessionFactoryを使用するベストプラクティスは、アプリケーションの実行中に複数回作成しないことです.このような操作は非常に悪いと見なされます.したがって、SqlSessionFactoryの最適な範囲はアプリケーション範囲である.最も簡単なのは、単一モードまたは静的単一モードを使用することです.しかし、この2つの方法はいずれもベストプラクティスとは考えられない.これにより、Google GuiceやSpringなどの注入容器に依存することが考えられます.このようなフレームワークでは、単一のSqlSessionFactoryのライフサイクルを管理するためのサポートプログラムを作成できます. 
 
3.SqlSession
各スレッドには、独自のSqlSessionインスタンスがある必要があります.SqlSessionのインスタンスは共有できません.スレッドも安全ではありません.したがって、最適な範囲はリクエストまたはメソッドの範囲です.SqlSessionインスタンスの参照は、クラスの静的フィールドまたはインスタンスフィールドには絶対に配置できません.また、SerlvetアーキテクチャのHttpSessionなど、SqlSessionインスタンスの参照を任意のタイプの管理範囲に配置することはできません.現在任意のWebフレームワークを使用している場合は、SqlSessionをHTTPリクエストオブジェクトと似た範囲に配置することを考慮します.言い換えれば、受信したHTTPリクエストに基づいて、SqlSessionを開いて応答に戻ることができ、それを閉じることができます.セッションを閉じることが重要です.finallyブロックを使用して閉じる必要があります.次の例は、SqlSessionがオフになっていることを確認する基本モードです.
 
SqlSession session = sqlSessionFactory.openSession(); 
try { 
	// do work 
} finally { 
	session.close(); 
} 

 
 
4.Mapperの例
マッパーは、マッピング文をバインドするインタフェースです.マッパーインタフェースの例は、SqlSessionから得ることができる.技術的に言えば、要求されたとき、
任意のマッパーインスタンスの最も広い範囲はSqlSessionと同じである.しかしながら、マッパーインスタンスの最適な範囲は、メソッド範囲である.つまり、それらを使用する方法で要求され、捨てられるべきです.明示的に閉じる必要はありません.要求オブジェクトに保持するのも問題ではありません.これはSqlSessionと似ています.このレベルで資源を管理しすぎると暴走することに気づくかもしれません.単純さを維持し、マッパーをメソッドの範囲内に配置します.次の例では、この実践を示します.
 
SqlSession session = sqlSessionFactory.openSession(); 
try { 
BlogMapper mapper = session.getMapper(BlogMapper.class); 
	// do work 
} finally { 
	session.close(); 
}