2016-10-07 6 views
1

Я создаю службу отдыха с использованием MyBatis 3.3.1, Spring 4.3, Jersey 2.22 и Oracle 12c. Мои транзакции управляются Spring с помощью DataSourceTransactionManager и аннотации @Transaction. Я также использую источник данных с пулом MyBatis как свой javax.sql.DataSource. Что я не понимаю, почему повторно используются сеансы базы данных.MyBatis + Spring + Jersey с Oracle Кажется, что он повторно использует сеансы SQL

В моем приложении я устанавливаю идентификатор клиента oracle: DBMS_SESSION.SET_IDENTIFIER («мой идентификатор»). С помощью операторов журнала отладки я могу видеть, как MyBatis создает новые сеансы для каждой из операций sql MyBatis. У меня также есть отладка, чтобы распечатать идентификатор сеанса базы данных из DBMS_SESSION.UNIQUE_SESSION_ID.

Что я не понимаю, так это то, что если я получаю доступ к конечной точке отдыха несколько раз, уникальный идентификатор сеанса совпадает с идентификатором моего последнего доступа.

Не следует ли использовать новый сеанс оракула каждый раз, когда MyBatis получает новый SQLSession? Почему сеанс oracle всегда одинаковый?

Спасибо.

ответ

0

Сессия в Oracle привязана к соединению. Вы используете пул соединений, поэтому после завершения одного запроса на отдых соединение возвращается в пул соединений. В этом случае сеанс не прерывается.

Возможно, вы захотите удалить идентификатор при возврате соединения в пул и установить его при извлечении соединения из пула. Точный способ сделать это зависит от используемого вами пула соединений. Для встроенного пула соединений mybatis см. this answer.

+0

Привет, Роман, Спасибо за ваш комментарий. Я попытался сделать что-то подобное с транзакциями, имея правильные переменные сеанса, установленные, когда транзакция начинается и удаляется при завершении транзакции. Однако, исходя из отладки, кажется, что MyBatis вызывает создание сеанса несколько раз в методе @Transactional. Я вижу, как создаются сеансы, а затем добавляется к текущей транзакции. Ожидается ли, что несколько сеансов составят транзакцию? Когда транзакция совершается, она фиксируется на всех сеансах? – tux

+0

Это зависит от конфигурации весны и mybatis. Обычно один сеанс создается на время транзакции. Центральным методом, реализующим эту логику, является 'org.mybatis.spring.SqlSessionUtils.getSqlSession'. –

+0

Я думаю, ваша проблема в том, что у вас есть два источника данных. Один из них настроен в mybatis, а другой - весной. Spring не знает о пустых источниках данных mybatis. Как вы настроили «SqlSessionFactory»? –