2013-02-19 3 views
0

Я хочу, чтобы иметь возможность регистрировать время, которое любой запрос берет на мой db. Я использую MyBatis для запроса БД.Шаблон для регистрации всех взаимодействий с базой данных с использованием перехватчика на bean-компоненте

В настоящее время у меня есть компонент без состояния, на котором есть методы, такие как select, update и т. Д., И клиенты моего компонента (через аннотацию @EJB) называют эти методы. Вдобавок к этому у меня есть перехватчик уровня класса на компоненте взаимодействия без учета состояния db, который выполняет мою регистрацию.

С любым вызовом bean-компонента без состояния бездействия я открываю сеанс, запускаю запрос пользователя, а затем закрываю сеанс, все в блоке try try. Это хорошо, потому что тогда клиенту EJB не нужно беспокоиться о закрытии сеансов или протоколировании того, как долго выполнялся запрос.

Проблема возникает, когда клиент EJB хочет сделать два запроса одному и тому же. Я не могу использовать источник данных XA, потому что поставщик не поддерживает его.

У меня есть обходное решение для этого, где я реализовал аналогичный компонент взаимодействия без привязки db, который не открывает и не закрывает сеансы в каждом методе выбора, обновления и т. Д., А скорее использует функции openSession() и closeSession ().

Моя забота о том, что это все еще фасол без состояния, и он может быть уничтожен в середине транзакции клиента, что приведет к откату. Это так? Должен ли я сделать его фасоль с состоянием?

Я также написал перехватчик, чтобы на самом деле вызвать openSession() и closeSession() для пользователя, чтобы они могли просто комментировать их класс или метод.

Это похоже на хороший образец или существует общий шаблон для обработки этого случая, который мне не хватает? Спасибо.

ответ

0

Если вы запрашиваете только одну БД, вам не нужны транзакции XA. Теперь транзакция может охватывать несколько вызовов метода EJB. Если аннотация транзакции ТРЕБУЕТСЯ по методу и при вызове метода активна транзакция, то метод будет выполняться в рамках существующей транзакции. Кроме того, транзакция связана с контекстом персистентности, поэтому, если вы позволите контейнеру внедрить EntityManager (используя аннотацию @PersistenceContext), где вам это нужно, ваша проблема будет решена. В этом случае вам не нужно вручную закрывать EntityManager.

+0

Я не использую сущности или любого сущ., Хотя я использую mybatis и простые старые сеансы sql, чтобы поговорить с базой данных. Любой совет? – user1608137

+0

Проверьте это обсуждение использования iBatis в EJB с транзакциями, охватывающими несколько вызовов: http://www.mail-archive.com/[email protected]/msg16139.html – Bogdan

+0

А также вы должны указать в своем оригинальный вопрос, что вы используете iBatis. – Bogdan