Есть ли кто-нибудь там, используя iBATIS 3 в качестве своей структуры персистенции внутри контейнера EJB? Недавно я начал создавать новую систему, для которой я выбираю EJB 3.1 (версия EJB на самом деле не имеет отношения к этому вопросу), так как моя инфраструктура приложения и iBATIS 3 (эта версия важна!) Как моя система сохранения. Моя бизнес-логика реализована в сессионных компонентах EJB 3.1, которые используют iBATIS 3 для доступа к данным. Я работаю на GlassFish v3)Управление транзакциями в iBATIS 3 внутри контейнера EJB (3.1)
Моя проблема с этим стеком была связана с управлением транзакциями. Я решил проблему, написав простой код интеграции, но я был немного удивлен, что должен был это сделать. Поэтому я решил опубликовать это, чтобы узнать, столкнулись ли с этим другие, и если да, то как они решили проблему.
Мое требование для iBATIS 3 для прозрачного использования транзакции EJB (обычно декларативно) в методе сессионного компонента. iBATIS 3 предоставляет 2 фабрики транзакций JdbcTransactionFactory и ManagedTransactionFactory, и я обнаружил, что ни один из них не работает правильно в среде EJB (и, глядя на источник iBATIS, понятно, почему он не работает).
JdbcTransactionFactory неуместен, так как я хочу, чтобы любые вызовы sqlSession.commit() или sqlSession.rollback() игнорировались. Поэтому я подумал, что я должен использовать ManagedTransactionFactory, так как он вызывает любые вызовы sqlSession.commit() или sqlSession.rollback(), которые нужно игнорировать, однако это также приводит к тому, что sqlSession.close() до не закрывает соединение, открытое iBATIS из DataSource в sqlSession.open() (DataSource - это объект DataSource, управляемый контейнером, который я предоставляю iBATIS). Это приводит к тому, что GlassFish исчерпывает пул подключений и приложение не работает.
Так что я написал новую реализацию TransactionFactory, EJBTransactionFactory, что вызывает sqlSession.commit() или sqlSession.rollback() ничего не делать, но делает близко соединение при sqlSession.close() называется.
Я подозреваю, что другие люди столкнулись с этим, как вы его решили?