سؤال

أنا باستخدام السبات 3 مع c3p0 عن برنامج باستمرار استخراج البيانات من مصدر ويكتب إلى قاعدة البيانات الخاصة بنا.المشكلة الآن هو أن قاعدة البيانات قد تصبح غير متوفرة لبعض الأسباب (في أبسط الحالات:أنا ببساطة إغلاقها).

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

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

حتى لو قبض على استثناء, كيف يمكنني نظيفة تهيئة السبات مرة أخرى ؟ (حتى الآن دون c3p0 أنا ببساطة بنيت الدورة المصنع مرة أخرى ، لكن لن أكون مندهشا إذا كان هذا يمكن أن تسرب اتصالات (أو هل هو موافق لفعل ذلك؟)).

قاعدة البيانات الموهوب مفتوحة المصدر الطبعة.

بلدي السبات.xml.cfg c3p0 التكوين:

<property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>  
<property name="hibernate.c3p0.breakAfterAcquireFailure">false</property>
<property name="hibernate.c3p0.acquireRetryAttempts">-1</property>
<property name="hibernate.c3p0.acquireRetryDelay">30000</property>
<property name="hibernate.c3p0.automaticTestTable">my_test_table</property>

<property name="hibernate.c3p0.initialPoolSize">3</property>
<property name="hibernate.c3p0.minPoolSize">3</property>
<property name="hibernate.c3p0.maxPoolSize">10</property>

راجع للشغل:الاختبار إنشاء الجدول و احصل على طن من إخراج التصحيح - لذلك يبدو أنه يقرأ الواقع التكوين.

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

المحلول

وحسنا يبدو أن BoneCP نفذت فعلا هذا. يمكن تعيينها لتسجيل المعاملات وإعادة تشغيله على فشل شبكة أو قاعدة البيانات:

HTTP: // jolbox.com/bonecp/downloads/site/apidocs/com/jolbox/bonecp/BoneCPConfig.html#setTransactionRecoveryEnabled(boolean)

نصائح أخرى

<اقتباس فقرة>   

إذا لم أكن مخطئا هذا هو واحد من الأشياء التي تجمع الاتصال يمكن أن تفعله بالنسبة لي: إذا كان هناك مشكلة مع ديسيبل، مجرد محاولة للاتصال - في أسوأ الأحوال للا نهاية

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

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

ولكن لا نتوقع التطبيق الخاص بك ليتم تعليق سحرية عندما يذهب قاعدة البيانات أسفل، بركة لن تفعل ذلك.

وشكرا لكم على الجواب. يبدو أنا فقط لم يفهم حقا الفقرة الأخيرة من المقطع http://www.mchange.com/projects/c3p0/index.html# configuring_recovery

ولأن في البداية يبدو c3p0 يمكن أن يفعل ذلك (الكشف عن الاتصالات التي لا معنى لها ومحاولة للحصول على وصلات إلى الأبد دون رمي أي وقت مضى استثناء من التعليمات البرمجية للتطبيق (ما لم يكن بالطبع عندما يتصل بها من خطأ إلى عبارة SQL وليس لل الاتصال)، ولكن في الفقرة الأخيرة - الذي هو مكتوب بطريقة مربكة جدا - يبدو كما لو c3p0 لا يمكن ضمان 100٪

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

أنت تنسى:

  • ماذا عن المعاملات التي تم بدأت ؟
  • ماذا عن أي preparedstatements التي تم إرسالها إلى DB بالفعل ؟
  • الخ

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

في حالة BoneCP (http://jolbox.com), حمام سباحة بالكشف عن فشل قد حدث عن طريق اصطياد استثناء القيت من قبل برنامج تشغيل JDBC الأولى و التعامل معها من قبل أي ضعف هذا الصدد باعتبارها معيبة أو آخر عن طريق إعادة كامل تجمع الاتصال.

تحرير:إنه يجري التعامل معها الآن.

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