سؤال

أنا أكتب تطبيق قاعدة بيانات Java JDBC يتصل بقاعدة بيانات Oracle 11G وأنا باستخدام مجموعة اتصال C3P0. لأغراض مثال ، لدي 3 مستخدمين لقاعدة البيانات الافتراضي ، Tom ، و Bill. يفتح C3P0 جميع الاتصالات المجمعة مع مستخدم قاعدة البيانات الافتراضية. أرغب في استرداد أحد الاتصالات المجمعة من C3P0 وتغيير المستخدم حتى يكون الاتصال فاتورة بدلاً من الافتراضي. هل من الممكن القيام بذلك في JDBC دون إنشاء اتصال جديد مع قاعدة البيانات؟

لقد حاولت بالفعل القيام بما يلي:

connect BILL/password;

لكن هذا لا يعمل. أحصل على خطأ في القول

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

هل هناك أي خيارات أخرى؟ هل هناك شيء له علاقة بمجموعة السياق أو التبديل يمكن أن يسهل ما أحاول القيام به؟

شكرًا!

هل كانت مفيدة؟

المحلول

بعد البحث بالأمس ، وجدت أن الحل هو استخدام مصادقة Oracle Proxy. هذا الحل خارج مواصفات 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 ، فإن اسم المستخدم الذي تتصل به هو نفس المخطط الذي تعمل عليه.

لقد استخدمت البيان أعلاه بنجاح في الماضي مع Oracle 10 عبر JDBC. كان المستخدم الخاص بي هو مستخدم الجذر/المسؤول ، وكان لديه أذونات إلى مخططات قاعدة البيانات المختلفة وكان لدي حاجة إلى التبديل بينهما في نفس الاتصال. لاحظ أنني لست بحاجة إلى توفير كلمة مرور مرة أخرى.

هذا لا يبدو وكأنه نموذج واعٍ للغاية للأمان ، لذلك لا أعرف ما إذا كان مناسبًا لحالة الاستخدام الخاصة بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top