Переключение пользователей при подключении JDBC
Вопрос
Я пишу приложение базы данных 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, у него были права на различные схемы базы данных, и мне приходилось переключаться между ними в одном и том же соединении.Обратите внимание, что мне не нужно было снова вводить пароль.
Это не похоже на модель, ориентированную на безопасность, поэтому я не знаю, подходит ли она для вашего случая использования.