سؤال

نحن عالقون في موقف حيث تستغرق إحدى عملياتنا 3 ساعات من الحوسبة دون لمس قاعدة البيانات. يتم إغلاق العلاقة التي تم اتخاذها قبل استدعاء العملية من قبل وحي الخادم وأي استعلام لاحق أو ملتزم رميات الاتصال المغلقة.

يبدو لنا أن المشكلة مرتبطة بإغلاق Oracle من الاتصال الخمول لفترة طويلة لسبب ما.

حاولنا تغيير Expire_timeout في sqlnet.ora لكن هذا لم يساعد أيضًا.

ماذا يمكننا أن نفعل لحل هذه المشكلة؟

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

المحلول

ما هو الخطأ الذي تحصل عليه عند محاولة استخدام الاتصال؟

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

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

ستشير رسالة خطأ Oracle الفعلية التي تتلقاها إلى أي من هذه البدائل تسبب مشكلتك.

نصائح أخرى

عرفان،

  1. يرجى التأكد من أن لديك Resource_Limit = true في ملف init.ora للتغييرات المفعمة بسرورها.

  2. أيضًا ، يرجى التحقق مما إذا كان المستخدم الذي تحاول تعيين الحد المسموح به يتم تعيينه إلى ملف التعريف الافتراضي.

select profile from dba_users where username = 'TEST_USER';
  PROFILE1

حدد ملف تعريف ، Resource_Name ، الحد من DBA_Profiles حيث ملف تعريف = 'profile1' و
Resource_name = 'Idle_time'

3 إذا كان المستخدم مصحوبًا بملف تعريف مخصص ، فتأكد من ضبط المعلمات الخاصة بالملف الشخصي المخصص. يجب أن تنظر أيضًا إلى معلمة Connect_time (في الافتراضي أو الملف الشخصي المخصص الذي ينطبق عليك. بمجرد تجاوز وقت الاتصال ، يتم إنهاء الاتصال.)

وأخيرًا ، يرجى ملاحظة أنه إذا بدأت الجلسة الحالية قبل تعيين المعلمة ، فلن يتم سريانها. التغييرات في الدورة التالية فقط بعد إجراء التغييرات.

روابط مفيدة.

http://www.adp-gmbh.ch/blog/2005/april/17.html
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:453256655431

شكرًا،

راجيش

يبدو السبب الفعلي ل connection closed exception هو نفس ما Justin كهف المذكورة في إجابته:

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

ستشير رسالة خطأ Oracle الفعلية التي تتلقاها إلى أي من هذه البدائل تسبب مشكلتك.

إذا كان هناك شخص ما يريد معرفة IDLE_TIME و CONNECT_TIME تم تكوينه لملف تعريف ، ثم يمكن للمرء تنفيذها أدناه الاستعلام:

select * from user_resource_limits user_resource where user_resource.resource_name in ('IDLE_TIME','CONNECT_TIME');

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

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