Переключение пользователей в соединении JDBC - PullRequest
4 голосов
/ 14 января 2010

Я пишу приложение базы данных 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 ]

5 голосов
/ 15 января 2010

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

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

1 голос
/ 14 августа 2012

Проверка

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

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

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

0 голосов
/ 14 января 2010

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

alter session set current_schema=BILL.

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

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

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

0 голосов
/ 14 января 2010

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

0 голосов
/ 14 января 2010

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

0 голосов
/ 14 января 2010

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

...