Пул соединений и Oracle Seesion

1

Прежде чем я начну с моего вопроса, я хотел бы уточнить, что я разработчик БД и мало разбираюсь в вещах на стороне Java/J2EE.

Ours - это веб-приложение (n-уровень с сервером приложений/веб-сервером). Мы используем пул соединений для управления соединениями с базой данных. У меня ограниченное понимание пула соединений - сервер приложений управляет соединениями для приложений, позволяет приложению получать соединение из пула, возвращать соединение после его завершения в пул.

Let say that I follow these steps - 
1. Let say that I log in the application
2. Application requests for a connection from connection pool to authenticate me
3. Once authentication is done, App server will return the connection back to pool
4. I browse to a page where I have to do some CRUD operation and let say that I am updating some data on the page.
5. App Server will again request for a connection from Pool
6. Application will process the data using the connection.

Вот мое выражение о проблеме -

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

Я устанавливаю глобальную переменную пакета, когда я вхожу в систему (шаг 1 - 3), в котором хранится зарегистрированное имя пользователя. Мой триггер будет читать глобальную переменную пакета для имени пользователя. Поскольку соединения не будут оставаться такими же (пул соединений управляет соединением), будет ли моя глобальная переменная пакета доступной, когда я обрабатываю триггер?

Что произойдет с переменной (это, очевидно, зависит от ответа на первый вопрос), когда несколько пользователей вошли в систему и обратились к приложению?

Я попытался оглянуться, но не смог получить ясный ответ на мои сомнения.

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

Теги:
oracle11g
database-connection
connection-pooling

1 ответ

2

Вы можете использовать атрибут CLIENT_IDENTIFIER, чтобы сохранить фактического пользователя, который зарегистрировался в приложении.

Ниже вы найдете дополнительную информацию из документации Oracle:

Поддержка пользовательских моделей приложений с использованием идентификаторов клиентов

Многие приложения используют сеансовый пул, чтобы настроить несколько сеансов для повторного использования несколькими пользователями приложений. Пользователи аутентифицируются в приложении среднего уровня, которое использует один идентификатор для входа в базу данных и поддерживает все пользовательские подключения. В этой модели пользователями приложения являются пользователи, прошедшие проверку подлинности на средний уровень приложения, но не знакомые с базой данных. Oracle Database поддерживает использование атрибута CLIENT_IDENTIFIER, который действует как прокси-сервер приложения для этих типов приложений.

В этой модели средний уровень передает идентификатор клиента в базу данных после установления сеанса. Идентификатором клиента может быть все, что представляет собой клиент, подключающийся к среднему уровню, например, cookie или IP-адрес. Идентификатор клиента, представляющий пользователя приложения, доступен в информации о сеансе пользователя и также может быть доступен с контекстом приложения (с использованием контекста именования USERENV). Таким образом, приложения могут настраивать и повторно использовать сеансы, сохраняя при этом возможность отслеживать пользователя приложения в сеансе. Приложения могут сбросить идентификатор клиента и, таким образом, повторно использовать сеанс для другого пользователя, что обеспечивает высокую производительность.

Вы можете установить CLIENT_IDENTIFIER в java, используя следующий фрагмент кода:

public Connection prepare(Connection conn) throws SQLException { String prepSql = "{ call DBMS_SESSION.SET_IDENTIFIER('userName') }"; CallableStatement cs = conn.prepareCall(prepSql); cs.execute(); cs.close(); return conn; }

  • 1
    @ Incognito - помогло ли вам вышеприведенное объяснение решить проблему?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню