EJB コンテナ内の永続化フレームワークとして iBATIS 3 を使用している人はいますか? 私は最近、アプリケーション フレームワークとして EJB 3.1 (EJB のバージョンは実際にはこの質問には関係ありません) を選択し、永続化フレームワークとして iBATIS 3 (このバージョンは関連しています!) を選択する新しいシステムの構築を開始しました。私のビジネス ロジックは、データ アクセスに iBATIS 3 を使用する EJB 3.1 セッション Bean に実装されています。私はGlassFish v3で実行しています)
このスタックに関する私の問題は、トランザクション管理です。簡単な統合コードを書くことで問題を解決しましたが、これをしなければならなかったことに少し驚きました。だから私はこれを投稿して、他の人がこれに遭遇したかどうか、もしそうならどのように問題を解決したかを確認することにしました.
私の要件は、iBATIS 3 がセッション Bean メソッドで EJB トランザクション (通常は宣言的に定義される) を透過的に使用することです。iBATIS 3 は JdbcTransactionFactory と ManagedTransactionFactory の 2 つのトランザクション ファクトリを提供しますが、どちらも EJB 環境で正しく動作しないことがわかりました (iBATIS ソースを見ると、失敗する理由が明らかです)。
sqlSession.commit() または sqlSession.rollback() への呼び出しを無視したいので、JdbcTransactionFactory は不適切です。したがって、sqlSession.commit() または sqlSession.rollback() への呼び出しが無視されるため、ManagedTransactionFactory を使用する必要があると思いましたが、sqlSession.close()が iBATIS から開いた接続を閉じません。 sqlSession.open() 内の DataSource (DataSource は、iBATIS に提供するコンテナ管理の DataSource オブジェクトです)。これにより、GlassFish がその接続プールを使い果たし、アプリケーションが失敗します。
そこで、sqlSession.commit() または sqlSession.rollback() が何もしないようにする新しい TransactionFactory 実装、EJBTransactionFactory を作成しましたが、sqlSession.close() が呼び出されたときに接続を閉じます。
他の人がこれに遭遇したと思いますが、どのように解決しましたか?