Как запустить dbms_application_info.set_client_info для каждой транзакции в Spring - PullRequest
0 голосов
/ 05 мая 2019

Я разрабатываю веб-приложение на Java, которое использует среду Spring и JPA для хранения данных в базе данных Oracle.

Приложение имеет журнал аудита, который обновляется триггерами, которые читают текущего пользователяиз SYS_CONTEXT ('USERENV', 'CLIENT_INFO'), чтобы отслеживать, какой пользователь вносит изменения.Чтобы это работало, значение также должно быть инициализировано путем выполнения DBMS_APPLICATION_INFO.SET_CLIENT_INFO для каждой транзакции.

В настоящее время это выполняется путем выполнения этого в фильтре сервлета:

entityManager.createNativeQuery("CALL dbms_application_info.set_client_info(?)")
    .setParameter(1, username)
    .executeUpdate();

Однако,Недавно я обнаружил, что последующие транзакции не обязательно используют одно и то же соединение с базой данных, что делает значение ненадежным.

Есть ли способ установить это глобально?Я полагаю, что это может быть сделано с помощью какой-либо оболочки или менеджера сущностей, который выполняет этот код до того, как будут внесены какие-либо изменения.Или, если есть какой-либо способ гарантировать, что все менеджеры сущностей используют одно и то же соединение с базой данных для одного и того же веб-запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...