Управление транзакциями в iBATIS 3 внутри контейнера EJB (3.1)

Кто-нибудь использует iBATIS 3 в качестве своей среды хранения внутри контейнера EJB? Недавно я начал создавать новую систему, для которой я выбрал EJB 3.1 (версия EJB на самом деле не имеет отношения к этому вопросу) в качестве среды приложения и iBATIS 3 (эта версия актуальна!) в качестве среды сохранения. Моя бизнес-логика реализована в сеансовых компонентах EJB 3.1, которые используют iBATIS 3 для доступа к данным. Я использую GlassFish v3)

Моя проблема с этим стеком заключалась в управлении транзакциями. Я решил свою проблему, написав простой код интеграции, но я был немного удивлен, что мне пришлось это сделать. Поэтому я решил опубликовать это, чтобы узнать, сталкивались ли с этим другие, и если да, то как они решили проблему.

Мое требование состоит в том, чтобы 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().

Я подозреваю, что другие люди сталкивались с этим, как вы это решили?


person bluecarbon    schedule 18.04.2010    source источник


Ответы (1)


В итоге это обсуждалось/решалось здесь: http://www.mail-archive.com/[email protected]/msg16138.html

person bluecarbon    schedule 10.08.2010