سؤال

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

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

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

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

المحلول

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

  • قم بالتخمين حول عدد الاتصالات المتزامنة التي يمكن لقاعدة البيانات الخاصة بك التعامل معها بشكل معقول (على سبيل المثال.ابدأ بـ 2 أو 3 لكل وحدة معالجة مركزية على جهاز قاعدة البيانات حتى تكتشف أن هذا قليل جدًا أو كثير جدًا - سيعتمد ذلك على مدى ارتباط استعلاماتك بالقرص)
  • إنشاء حمام سباحة من هذه الاتصالات الكثيرة:في الأساس فئة يمكنك طلب "الاتصال المجاني التالي" في بداية كل طريقة ثم "الرجوع" إلى التجمع في نهاية كل طريقة
  • تحتاج طريقة getFreeConnection() الخاصة بك إلى إعادة اتصال مجاني إذا كان متاحًا، وإلا إما (1) إنشاء اتصال جديد، حتى الحد الأقصى لعدد الاتصالات التي قررت السماح بها، أو (2) إذا تم إنشاء الحد الأقصى بالفعل ، انتظر حتى يصبح واحدًا مجانيًا
  • أوصي بفئة Semaphore لإدارة الاتصالات؛لدي بالفعل مقالة قصيرة على موقع الويب الخاص بي إدارة تجمع الموارد باستخدام إشارة مع مثال أعتقد أنه يمكنك التكيف مع غرضك

بضعة اعتبارات عملية:

  • للحصول على الأداء الأمثل، عليك أن تكون حذرا عدم "تقطيع" الاتصال أثناء عدم استخدامه فعليًا لتشغيل استعلام.إذا حصلت على اتصال من التجمع مرة واحدة ثم قمت بتمريره إلى طرق مختلفة، فستحتاج إلى التأكد من أنك لا تفعل ذلك عن طريق الخطأ.
  • لا تنس إعادة اتصالاتك إلى المسبح!(حاول/أخيرًا هو صديقك هنا...)
  • في العديد من الأنظمة، أنت لا يمكن إبقاء الاتصالات مفتوحة "للأبد":سيقوم O/S بإغلاقها بعد فترة زمنية قصوى.لذا، في طريقة "إعادة الاتصال إلى التجمع"، ستحتاج إلى التفكير في الأمر الاتصالات "المتقاعدة" التي كانت موجودة لفترة طويلة (قم ببناء بعض آليات التذكر، على سبيل المثال:من خلال وجود كائن المجمع حول كائن اتصال JDBC فعلي يمكنك استخدامه لتخزين مقاييس مثل هذه)
  • قد ترغب في النظر في استخدام البيانات المعدة.
  • بمرور الوقت، ربما ستحتاج إلى ذلك تعديل حجم تجمع الاتصال

نصائح أخرى

ويمكنك إما تمرير في الاتصال أو الأفضل من ذلك استخدام شيء مثل جاكرتا تجمع اتصال قاعدة البيانات. http://commons.apache.org/dbcp/

ويجب عليك استخدام تجمع الاتصال لذلك.

وبهذه الطريقة يمكن أن تسأل عن اتصال والافراج عنها عندما تكون النهاية معه وإعادته إلى تجمع

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

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

وConnectionPools الدرجة الأولى لسوء الحظ ليس من السهل جدا للاستخدام في التطبيقات المستقلة (هم الافتراضي في خوادم التطبيقات) ربما لmicrocontainer (مثل سبنج) أو إطارا جيدا (مثل السبات) يمكن أن تتيح لك استخدام واحد.

وانهم لا يصعب جدا إلى رمز واحد على الرغم من أن من نقطة الصفر.

و:)

هذا البحث جوجل سيساعد يمكنك العثور على المزيد حول كيفية استخدام واحد.

والمقشود من خلال

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

هناك طريقة أخرى لتجمعات الاتصال وهي

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

خلاف ذلك، أود أن أقترح استخدام تجمع اتصال.

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

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

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

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