Question

Je suis en train d'écrire une application de base de données Java JDBC qui se connecte à une base de données Oracle 11g et je utilise un pool de connexion c3p0. Aux fins d'un exemple, j'ai 3 utilisateurs de la base de données DEFAULT, TOM et PROJET DE LOI. c3p0 ouvre toutes les connexions mises en commun avec l'utilisateur de base de données DEFAULT. Je voudrais récupérer l'une des connexions mises en commun de C3P0 et changer l'utilisateur pour la connexion à BILL au lieu de DEFAULT. Est-il possible de le faire dans JDBC sans établir une nouvelle connexion avec la base de données?

Je l'ai déjà essayé de faire ce qui suit:

connect BILL/password;

Mais cela ne fonctionne pas. Je reçois une erreur disant

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

Y at-il d'autres options? Y at-il quelque chose ayant à voir avec le contexte de définir ou de commutation qui peut faciliter ce que je suis en train de faire?

Merci!

Était-ce utile?

La solution

Après des recherches hier, je trouve que la solution consiste à utiliser l'authentification Oracle Proxy. Cette solution est en dehors de la spécification JDBC. Cependant, Oracle fournit un crochet pour mettre en œuvre une telle solution. Ouverture d'une connexion proxy ressemblerait comme suit:

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

Je ne serais pas surpris s'il y a d'autres nuances associées à cela, mais cela est un bon début. Merci pour votre aide, tout le monde!

Autres conseils

Vérifier

JDBC Extension Oracle VPD

Réglage OracleConnection.clientIdentifier semble plus standard / convenable pour moi

Désolé pour poster sur le vieux fil, juste pensé à la mise à jour.

Si ces utilisateurs ne se connecte pas de manière interactive à la base de données via votre application, est-il déraisonnable d'avoir juste trois piscines distinctes, une pour chaque utilisateur? Ensuite, utilisez une gestionnaire de connexion pour récupérer la connexion appropriée?

Vous pouvez utiliser DataSource.getConnection(String user, String password). c3p0 maintient à l'intérieur d'un bassin séparé pour chaque utilisateur.

c3p0 crée des connexions physiques avec les informations d'identification vous lui avez dit à utiliser et vous ne pouvez pas modifier les informations d'identification d'une connexion obtenue à partir d'une piscine après les faits. Si vous souhaitez utiliser des connexions avec les différents utilisateurs de la base de données, vous devez créer et utiliser différents pools.

Avez-vous essayé cette déclaration via l'émission JBDC:

alter session set current_schema=BILL.

Si je me souviens bien la structure oracle, le nom d'utilisateur avec lequel vous vous connectez est le même que le schéma que vous travaillez.

Je l'ai fait utiliser la déclaration ci-dessus avec succès dans le passé avec Oracle 10 via JDBC. Mon utilisateur est l'utilisateur root / admin, il avait des autorisations aux schémas de base de données diverses et j'avais besoin de basculer entre eux dans la même connexion. Notez que je ne l'ai pas besoin de fournir un mot de passe.

Cela ne ressemble pas à un modèle de sécurité très soucieux, donc je ne sais pas si elle est adaptée à votre cas d'utilisation.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top