هل هناك أي طريقة لإعادة اتصال تجمع اتصالات JBoss بـ Oracle عندما تسوء الاتصالات؟

StackOverflow https://stackoverflow.com/questions/128527

سؤال

لدينا JBoss وOracle على خوادم منفصلة.يبدو أن الاتصالات قد انقطعت وتسببت في حدوث مشكلات مع JBoss.كيف يمكنني إعادة اتصال JBoss بـ Oracle إذا كان الاتصال سيئًا بينما نكتشف سبب انقطاع الاتصالات في المقام الأول؟

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

المحلول

يوجد عادةً خيار تكوين في المجمع لتمكين تنفيذ استعلام التحقق من الصحة عند الاقتراض.إذا تم تنفيذ استعلام التحقق من الصحة بنجاح، فسيقوم المجمع بإرجاع هذا الاتصال.إذا لم يتم تنفيذ الاستعلام بنجاح، فسيقوم المجمع بإنشاء اتصال جديد.

ال جي بوس ويكي يوثق السمات المختلفة للمسبح.

<check-valid-connection-sql>select 1 from dual</check-valid-connection-sql>

يبدو أنه يجب أن يقوم بالخدعة.

نصائح أخرى

على الرغم من أنه يمكنك استخدام الحيلة القديمة "اختر 1 من ثنائي"، إلا أن الجانب السلبي في ذلك هو أنها تصدر استعلامًا إضافيًا في كل مرة تستعير فيها اتصالاً من المجمع.بالنسبة للكميات الكبيرة، يعد هذا إسرافًا.

يوفر JBoss مدقق اتصال خاصًا يجب استخدامه لـ Oracle:

<valid-connection-checker-class-name>
    org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker
</valid-connection-checker-class-name>

يستخدم هذا أسلوب ping() الخاص في فئة اتصال Oracle JDBC، ويستخدم رمز الشبكة الأساسي لبرنامج التشغيل لتحديد ما إذا كان الاتصال لا يزال حيًا.

ومع ذلك، لا يزال تشغيل هذا في كل مرة يتم فيها استعارة اتصال أمراً مضيعة، لذلك قد ترغب في استخدام المنشأة حيث يتحقق مؤشر ترابط الخلفية من الاتصالات الموجودة في المجمع، ويتجاهل الاتصالات الميتة بصمت.وهذا أكثر كفاءة، ولكنه يعني أنه إذا كانت الاتصالات يفعل ستنتهي، أي محاولة لاستخدامها قبل تشغيل مؤشر ترابط الخلفية الخاص به ستفشل.

انظر مستندات ويكي لمعرفة كيفية تكوين فحص الخلفية (ابحث عن background-validation-millis).

لا يوجد ما يكفي من الممثلين للتعليق، لذلك فهو في شكل إجابة.ال 'Select 1 from dual' و سكافمان org.jboss.resource.adapter.jdbc.vendor.OracleValidConnectionChecker الطريقة متكافئة، على الرغم من أن فحص الاتصال يوفر مستوى من التجريد.كان علينا فك ترجمة برامج تشغيل oracle jdbc لإجراء تمرين استكشاف الأخطاء وإصلاحها وتنفيذ Oracle الداخلي لـ ping هو إجراء 'Select 'x' from dual'.ناتش.

يوفر JBoss طريقتين للتحقق من صحة الاتصال:- ping على أساس - الاستعلام على أساس

يمكنك استخدامها حسب المتطلبات.تتم جدولة ذلك بواسطة مؤشر ترابط منفصل حسب المدة المحددة في ملف تكوين مصدر البيانات.

<background-validation>true</background-validation> <background-validation-minutes>1</background-validation-minutes>

في بعض الأحيان، إذا لم يكن لديك برنامج تشغيل أوراكل مناسب في Jboss، فقد تحصل على خطأ classcast أو خطأ ذي صلة ولهذا الاتصال قد يبدأ التسرب من تجمع الاتصال.يمكنك محاولة إنشاء فئة ConnectionValidator الخاصة بك عن طريق التنفيذ org.jboss.resource.adapter.jdbc.ValidConnectionChecker واجهه المستخدم.توفر هذه الواجهة طريقة واحدة فقطisValidConnection()'وتوقع "NULL" مقابل اتصال صالح.

السابق:

public class OracleValidConnectionChecker implements ValidConnectionChecker, Serializable {

   private Method ping;

   // The timeout (apparently the timeout is ignored?)
   private static Object[] params = new Object[] { new Integer(5000) };

   public SQLException isValidConnection(Connection c) {

       try {
           Integer status = (Integer) ping.invoke(c, params);

           if (status.intValue() < 0) {
               return new SQLException("pingDatabase failed status=" + status);
           }

       }
       catch (Exception e) {
           log.warn("Unexpected error in pingDatabase", e);
       }

       // OK
       return null;
   }
}

لقد واجهنا مؤخرًا بعض حالات الفشل في معالجة الطلبات العائمة بسبب أوراكل اليتيم DBMS_LOCK أقفال الجلسة التي تم الاحتفاظ بها إلى أجل غير مسمى في تجمع الاتصال من جانب العميل.

إذن إليك الحل الذي يفرض انتهاء صلاحية الجلسة خلال 30 دقيقة ولكنه لا يؤثر على تشغيل التطبيق:

<check-valid-connection-sql>select case when 30/60/24 > sysdate-LOGON_TIME then 1 else 1/0 end 
from V$SESSION where AUDSID = userenv('SESSIONID')</check-valid-connection-sql>

قد يتضمن هذا بعض التباطؤ في عملية الحصول على الاتصالات من التجمع.تأكد من اختبار هذا تحت الحمل.

تحديث بسيط لإجابة @ Skaffman.في JBoss 7، يجب عليك استخدام سمة "اسم الفئة" عند تعيين مدقق اتصال صالح وأيضًا الحزمة مختلفة:

<valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.oracle.OracleValidConnectionChecker" />

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