Я разрабатываю веб-приложение на 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();
Однако,Недавно я обнаружил, что последующие транзакции не обязательно используют одно и то же соединение с базой данных, что делает значение ненадежным.
Есть ли способ установить это глобально?Я полагаю, что это может быть сделано с помощью какой-либо оболочки или менеджера сущностей, который выполняет этот код до того, как будут внесены какие-либо изменения.Или, если есть какой-либо способ гарантировать, что все менеджеры сущностей используют одно и то же соединение с базой данных для одного и того же веб-запроса.