Переключение пользователей в соединении JDBC
Я пишу приложение базы данных Java JDBC, которое подключается к базе данных Oracle 11g и использую пул соединений c3p0. Для примера у меня есть 3 пользователя базы данных DEFAULT, TOM и BILL. c3p0 открывает все пулы соединений с пользователем базы данных DEFAULT. Я хотел бы получить одно из подключенных подключений из c3p0 и изменить пользователя для подключения на BILL вместо DEFAULT. Можно ли сделать это в JDBC, не устанавливая новое соединение с базой данных?
Я уже пытался сделать следующее:
connect BILL/password;
Но это не работает. Я получаю сообщение об ошибке
java.sql.SQLException: ORA-00900: invalid SQL statement
Есть ли другие варианты? Есть ли что-то связанное с набором контекста или переключением, которое может облегчить то, что я пытаюсь сделать?
Спасибо!
6 ответов
После вчерашних исследований я обнаружил, что решение заключается в использовании Oracle Proxy Authentication. Это решение не входит в спецификацию 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, у него были разрешения на различные схемы базы данных, и мне нужно было переключаться между ними в одном соединении. Обратите внимание, что мне не нужно было вводить пароль снова.
Это не похоже на очень заботящуюся о безопасности модель, поэтому я не знаю, подходит ли она для вашего случая использования.