Pregunta

Estoy escribiendo una aplicación de base de datos JDBC de Java que se conecta a una base de datos Oracle 11g y estoy usando un pool de conexiones c3p0. A los efectos de un ejemplo, tengo 3 usuarios de base de datos predeterminada, TOM, y Bill. c3p0 abre todas las conexiones agrupadas con el usuario base de datos predeterminada. Me gustaría recuperar una de las conexiones agrupadas de c3p0 y cambiar el usuario para la conexión a ser BILL en lugar de DEFAULT. ¿Es posible hacer esto en JDBC sin establecer una nueva conexión con la base de datos?

Ya he intentado hacer lo siguiente:

connect BILL/password;

Sin embargo, esto no funciona. Me sale un error que dice

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

¿Hay alguna otra opción? ¿Hay algo que tiene que ver con el contexto establecido o conmutación que puede facilitar lo que estoy tratando de hacer?

Gracias!

¿Fue útil?

Solución

Después de investigar ayer, he encontrado que la solución es utilizar la autenticación de proxy de Oracle. Esta solución está fuera de la especificación JDBC. Sin embargo, Oracle proporciona un gancho para implementar una solución de este tipo. La apertura de una conexión proxy se vería de la siguiente manera:

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 */

No me sorprendería si hay otros matices asociados a este, pero este es un buen comienzo. Gracias por su ayuda, todo el mundo!

Otros consejos

Comprobar

JDBC Extensión para Oracle VPD

Configuración OracleConnection.clientIdentifier se ve más estándar / conveniente para mí

Lo sentimos poder escribir en el hilo de edad, acaba de ocurrir actualización.

Si estos usuarios no inicien sesión de forma interactiva a la base de datos a través de su aplicación, es que no es razonable que sólo tienen tres piscinas separadas, una para cada usuario? A continuación, utilice algún administrador de conexión para recuperar la conexión adecuada?

Puede utilizar DataSource.getConnection(String user, String password). c3p0 mantiene internamente una piscina separada para cada usuario.

c3p0 crea conexiones físicas con la credencial que le dijo que lo utilice y no se puede cambiar las credenciales de una conexión obtenida de una piscina después de los hechos. Si desea utilizar conexiones con los diferentes usuarios de bases de datos, es necesario crear y utilizar diferentes piscinas.

¿Ha tratado de emitir este comunicado a través de JBDC:

alter session set current_schema=BILL.

Si no recuerdo mal la estructura de Oracle, el nombre de usuario con el que se conecta es el mismo que el esquema que se está trabajando.

Hice uso de la declaración anterior éxito en el pasado con Oracle 10 a través de JDBC. Mi usuario fue el usuario root / admin, tenía permisos a diferentes esquemas de bases y que tenía una necesidad de cambiar entre ellos en la misma conexión. Nótese que no tenía necesidad de proporcionar una contraseña de nuevo.

Esto no suena como un modelo muy consciente de la seguridad, por lo que no sé si es adecuado para su caso de uso.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top