Как узнать, использовался ли ранее OracleConnection из пула соединений - PullRequest
0 голосов
/ 20 сентября 2011

Мое приложение должно аутентифицировать весь сеанс в БД с помощью доверенной процедуры (которая устанавливает некоторые значения в контексте сеанса).В настоящее время эта процедура вызывается для каждого нового сеанса сразу после его открытия.

Теперь я хотел бы улучшить это, удалив ненужные обходы.Соединения из пула соединений, которые использовались (и аутентифицировались) ранее, не требуют повторного вызова процедуры, потому что переменные контекста сеанса все еще установлены на сервере.

Но я не могу найти способ идентифицироватьповторно используемые соединения.Есть ли какой-либо способ (который, конечно, тоже не нуждается в передаче туда и обратно)?

Архитектура: несколько клиентских приложений используют одну и ту же учетную запись БД (учетная запись только для чтения с синонимами к реальной схеме) для подключения,После подключения требуется, чтобы каждый новый сеанс вызывал процедуру аутентификации для установки некоторых переменных контекста сеанса.Эти контекстные переменные проверяются при выборе / вставке / обновлении / удалении Oracle FGAC (виртуальная частная база данных).

Мой код:

OracleConnection conn = new OracleConnection();
conn.ConnectionString = _connectionString;
conn.Open();

if (true) { // TODO: Identify not yet authenticated connections.
   using (OracleCommand cmd = new OracleCommand("authentication.login", conn)) {
      cmd.CommandType = CommandType.StoredProcedure;
      cmd.Parameters.Add("i_user_id", OracleDbType.Int64).Value = _userId;
      cmd.Parameters.Add("i_role_id", OracleDbType.Int64).Value = _roleId;
      cmd.ExecuteNonQuery();
   }
}

Ответы [ 4 ]

1 голос
/ 20 июля 2018

Вы должны очистить все контексты и сбросить все пакеты в любом случае, когда вы получаете соединение из пула соединений. Добавьте эту аутентификацию к вашей инициализации.

Подготовка соединения Oracle после извлечения из ConnectionPool

1 голос
/ 20 сентября 2011

Вы можете создать пул соединений для ваших соединений оракула.И каждое создаваемое вами соединение может быть вставлено с помощью некоторого ключа (используя conn.setSessionInfo(key)), который можно проверить позже, когда вы вернете соединение.
Ключом может быть любая вещь на ваш выбор или хеш-ключ, который вы генерируете.

0 голосов
/ 08 апреля 2013

Наконец-то я нашел ответ, в котором четко сказано, что это невозможно: Пул соединений ODP.NET: как узнать, использовалось ли соединение

0 голосов
/ 20 сентября 2011

Мне не ясно, что делает ваша аутентификация - проверяет, что соединение исходит из вашего приложения? - и передаете ли вы что-нибудь в вашу процедуру. Не могли бы вы рассмотреть возможность использования триггера входа в систему для вызова вашей процедуры со стороны БД, только для пользователя, которого использует ваш пул при создании сеанса?

...