JDBC接続のユーザーを切り替えます
質問
私は、Oracle 11gデータベースに接続し、C3P0接続プールを使用していたJava JDBCデータベースアプリケーションを書いています。例の目的のために、私は3データベース・ユーザーのDEFAULT、TOM、およびBILLを持っています。 C3P0は、デフォルトのデータベース・ユーザーとプールされた接続のすべてを開きます。私はC3P0からプールされた接続のいずれかを取得し、BILLの代わりに、DEFAULTことに接続するためのユーザーを変更したいと思います。データベースとの新しい接続を確立せずにJDBCでこれを行うには、それは可能ですか?
私はすでに次の操作を実行しようとしています:
connect BILL/password;
しかし、これは動作しません。私はというエラーを取得します。
java.sql.SQLException: ORA-00900: invalid SQL statement
他のオプションはありますか?私は何をしようとしている容易にすることができるコンテキスト設定や切り替えを行うに持つものはありますか?
ありがとうございます。
解決
昨日調査した結果、私は解決策は、Oracleプロキシ認証を使用することであることがわかりました。このソリューションは、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 */
これに関連する他のニュアンスがある場合、私は驚かないだろうが、これは良いスタートです。あなたの助けをありがとう、みんな!
他のヒント
、それだけで3つの別々のプール、ユーザーごとに1つを持ってするのは無理でしょうか?その後、適切な接続を取得するために、いくつかの接続マネージャを使用できますか?
あなたはDataSource.getConnection(String user, String password)
を使用することができます。 C3P0は内部ユーザーごとに個別のプールを維持します。
C3P0は、あなたが使用することを彼に言った、あなたは事実の後にプールから取得した接続の資格情報を変更することはできません資格を持つ物理的な接続を作成します。あなたが別のデータベース・ユーザーとの接続を使用する場合は、別のプールを作成して使用する必要があります。
あなたがJBDC経由でこの文を発行しようとしたことがあります:
alter session set current_schema=BILL.
私が正しくオラクル構造、あなたが作業しているスキーマと同じで接続すると、ユーザー名を覚えていれば。
私は、JDBC経由でOracleの10で、過去に成功した上記のステートメントを使用しました。私のユーザーがroot /管理者ユーザーだった、それはさまざまなデータベース・スキーマへのアクセス権を持っていたと私は同じ接続にそれらの間で切り替える必要がありました。私はもう一度パスワードを入力する必要はありませんでしたことに注意してください。
これは非常にセキュリティ意識の高いモデルのような音はありませんので、それはあなたのユースケースに適しているかどうかはわからない。