Spring+Mybatis開発環境におけるSql Session Templateオブジェクトはなぜスレッドが安全なのですか?なぜデータベース接続のリークが発生しないですか?


問題1:Sql Session Templateオブジェクトはなぜスレッドが安全なのですか?    Sql Session TemplateはSql Sessionインターフェースの一つの実現であり、Spring容器特有のものであり、Spring容器には以下のように定義されています。

	  

デフォルトのscopeはsingleton(単例)です。単例である以上、Sql Session Templateオブジェクトは何ですか?それともスレッドが安全ですか?
対象Sql Session Templateオブジェクトにおいて、オブジェクトSql Session Proxyダイナミックエージェントが定義されています。動的エージェントを利用して、添削調査を実行します。動的エージェントにおける動的プロセッサSql Session InterceptorではSql Sessionを利用してSql Sectionを取得します。get Sql Sessionに入ってソースを調べたら、Sql Sessionはメンバー変数としてSql Session Holderのオブジェクトに保存されていますが、Sql Session Holderは現在の事務管理クラスTransation Syncion Managerのスレッドセキュリティ変数resourceに保存されています。事務管理クラスTransaction Synch ronizationManagerのメンバー変数は、事務終了後にクリアされます。したがって、Sql Session Templateは同じスレッドの同じトランザクションにおいてスレッドが安全である。
問題二:Sql Session Templateオブジェクトを呼び出した後、接続リリースを行っていません。なぜ接続漏れが発生しないですか?    もしSql Sessionを新たに作ってリリースしないなら、session.closeを呼び出しないと、データベース接続数が急激に増加し、データが崩壊してアクセスできなくなるまで、これを接続リークといいます。問題一の分析によると、Sql Session Templateオブジェクトは具体的なスレッド内にスレッドセキュリティのSql Sessionオブジェクトを作成します。したがって、リリースしなくてもSql Sessionが無限に増えることはありません。
問題3:Springフレームに依存しない場合、どうやってSql Sessionを使ってスレッドの安全と接続漏れが発生しないようにしますか?答え3:
SqlSessionFactory sqlSessionFactory = MyBatisUtil.getSqlSessionFactory();
sqlSession = SqlSessionManager.newInstance(sqlSessionFactory);
このうちorg.apache.ibatis.session.Sql Session Manager類が作成したSql Sessionはスレッドの安全であり、自動的にリリースされます。
参考:https://www.cnblogs.com/daniels/p/8242592.html https://blog.csdn.net/zgrgfr/article/details/53304953 http://www.cnblogs.com/daxin/p/3544188.html https://www.cnblogs.com/zcmzex/p/9005194.html