Oracle пакет глобальных переменных с несколькими сессиями
У меня есть пакет Oracle с некоторыми глобальными переменными, которые инициализируются и используются во всех процедурах этого пакета.
Когда я вызываю процедуры (через соединение и вызовы jdbc), глобальные переменные правильно инициализируются, и их значения сохраняются в течение всех процедур в сеансе базы данных, который был открыт, но когда у меня есть несколько соединений jdbc, кажется, что значения глобальных переменных смешиваются между звонки.
Разве сеансы Oracle не изолированы с точки зрения переменных пакетов? Есть ли какая-то конфигурация, которую мне нужно сделать в базе данных или профиле пользователя, чтобы гарантировать эту изоляцию?
Мой экземпляр БД находится в RAC с 2 узлами.
1 ответ
Каждый сеанс базы данных имеет свой собственный набор переменных, да.
Я ожидаю, что ваше Java-приложение использует пул соединений так, что ваше Java-приложение постоянно получает соединения из пула и возвращает их в пул. В этом случае нет никакой связи между сеансом Java и сеансом Oracle. Определенный сеанс Java может использовать сеанс Oracle A для первого вызова, сеанс Oracle B для второго вызова, C для третьего вызова и снова B для четвертого вызова. И другие сеансы будут делать то же самое, поэтому состояние сеанса B могло измениться между двумя вызовами, потому что какой-то другой сеанс Java использовал его в промежуточный период.
Некоторые реализации пула соединений явно очищают переменные пакета, когда сеанс возвращается в пул, чтобы данные не просачивались из одного сеанса в другой. Другие реализации позволили бы различным сеансам Java видеть переменные пакета в любом состоянии, в котором они оказались от предыдущего вызова. В любом случае поддержание состояния в пакетах как части корпоративного Java-приложения - плохая идея.
Возможно, что вместо этого вам нужен глобальный контекст, но это трудно понять наверняка, поскольку мы не знаем, какую проблему вы пытаетесь решить с помощью переменных вашего пакета.