Переключение пользователей при подключении JDBC

StackOverflow https://stackoverflow.com/questions/2066295

Вопрос

Я пишу приложение базы данных Java JDBC, которое подключается к базе данных Oracle 11g, и использую пул соединений c3p0.В качестве примера у меня есть три пользователя базы данных DEFAULT, TOM и BILL.c3p0 открывает все объединенные соединения с пользователем базы данных DEFAULT.Я хотел бы получить одно из объединенных соединений из c3p0 и изменить пользователя для соединения на BILL вместо DEFAULT.Можно ли это сделать в JDBC без установления нового соединения с базой данных?

Я уже пробовал сделать следующее:

connect BILL/password;

Но это не работает.Я получаю сообщение об ошибке

java.sql.SQLException: ORA-00900: invalid SQL statement

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

Спасибо!

Это было полезно?

Решение

После вчерашнего исследования я обнаружил, что решение состоит в использовании аутентификации Oracle Proxy.Это решение выходит за рамки спецификации JDBC.Однако Oracle предоставляет возможность реализовать такое решение.Открытие прокси-соединения будет выглядеть следующим образом:

import oracle.jdbc.OracleConnection;    

//Declare variables
String url = "...";
String username = "...";
String password = "...";

//Create the Connection
Connection conn = DriverManager.getConnection(url, username, password);

//Set the proxy properties
java.util.Properties prop = new java.util.Properties();
prop.put(OracleConnection.PROXY_USER_NAME, "BILL");
prop.put(OracleConnection.PROXY_USER_PASSWORD, "password");

//Cast the Connection to an OracleConnection and create the proxy session
((OracleConnection)conn).openProxySession(OracleConnection.PROXYTYPE_USER_NAME, prop);

/* The Connection credentials have now been changed */

Не удивлюсь, если с этим связаны и другие нюансы, но это хорошее начало.Спасибо за вашу помощь всем!

Другие советы

Проверять

Расширение JDBC для Oracle VPD

Установка OracleConnection.clientIdentifier выглядит для меня более стандартной/подходящей

Извините, что пишу в старую тему, просто подумал обновить.

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

Вы можете использовать DataSource.getConnection(String user, String password).c3p0 внутренне поддерживает отдельный пул для каждого пользователя.

c3p0 создает физические соединения с учетными данными, которые вы ему сказали использовать, и вы не можете изменить учетные данные соединения, полученные из пула после фактов.Если вы хотите использовать соединения с разными пользователями базы данных, вам необходимо создавать и использовать разные пулы.

Вы пытались выдать этот оператор через jbdc:

alter session set current_schema=BILL.

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

Раньше я успешно использовал приведенный выше оператор с Oracle 10 через jdbc.Мой пользователь был пользователем root/admin, у него были права на различные схемы базы данных, и мне приходилось переключаться между ними в одном и том же соединении.Обратите внимание, что мне не нужно было снова вводить пароль.

Это не похоже на модель, ориентированную на безопасность, поэтому я не знаю, подходит ли она для вашего случая использования.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top