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

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

Другие вопросы по тегам