سؤال

ما هي أفضل طريقة لإعداد حمام السباحة الخاص بك فيما يتعلق بما يلي:-

  1. متى تقوم بإنشاء اتصالات؟
  2. متى تغلق الاتصالات، وهل ستغلقها كلها؟
  3. هل اختبار الاتصالات لا تزال جيدة.متى وكيف؟
  4. كيف يمكنك معرفة عدد جيد لأقصى عدد من الاتصالات؟
  5. ما نوع المراقبة التي تطبقها لضمان حسن سلوك مستخدمي المجموعة؟هل يمكنك إيقاف قطعة واحدة سيئة من التعليمات البرمجية من إزالة كل شيء؟
  6. هل كتبت مجموعتك الخاصة، أو استخدمت مكتبة تابعة لجهة خارجية؟

أعتقد أن هذا سؤال لا أدري، لكن التعليقات حول "ميزات" قواعد بيانات/لغات معينة مرحب بها.على سبيل المثال، قد يكون الاتصال ببعض قواعد البيانات أبطأ أو أكثر تكلفة من غيرها.

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

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

المحلول

لقد كتبت تجمع اتصال لقاعدة البيانات في Java عندما كان مجرد نمط تصميم وليس مكتبة مشتركة.الآن أستخدم الأداة المضمنة في Tomcat.

لقد استخدمت خيطًا لمراقبة عدة جوانب من التجمع والعديد من المعلمات للتحكم في سلوكه ...

  1. الحد الأدنى في تجمع = "3"...يتم إنشاء هذه الثلاثة الأولى عند الإطلاق.لا يُسمح مطلقًا بالهبوط إلى أقل من ثلاثة.
  2. الحد الأقصى لـIdleTimeBeforeRemoval = "60"...إذا ظل الاتصال خاملاً لمدة ساعة، فقم بإسقاطه وإنشاء اتصال جديد.ربما يعني وقت الخمول أن هناك ثلاثة فقط على الأقل في المجموعة.
  3. الحد الأقصىInUseTimeBeforeRemoval = "30"...إذا تم سحب اتصال معين لمدة تزيد عن 30 دقيقة، فمن المحتمل أن يكون هناك خطأ ما.أذكره، واقطع الاتصال.
  4. الحد الأقصى لتيميبيفورريموفال = "60"...قم بإزالته إذا كان عمره أكثر من 60 دقيقة.
  5. الحد الأقصى للاستخدام قبل الإزالة = "1000"...قم بإزالته إذا تم سحبه أكثر من 1000 مرة.
  6. مراقب الفاصل = "15"...تحقق من المعلمات المذكورة أعلاه كل 15 دقيقة.

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

لقد استخدمت برامج تشغيل JDBC الرفيعة من Oracle وقمت بالاتصال بقاعدة بيانات Oracle.

نصائح أخرى

هذا هو الأساس المنطقي الذي استخدمته للتنفيذ الأخير.

  1. لديك نوعين من الاتصالات في تجمع الاتصال الخاص بك.الأول جاهز، أي مفتوح ولكن ليس قيد الاستخدام من قبل العميل.والثاني نشيط أي قيد الاستخدام من قبل العميل.

  2. اجعل تجمع الاتصالات الخاص بك يحافظ على عدد صغير من الاتصالات الجاهزة، بحد أدنى N وحد أقصى M.يمكن تعديل N وفقًا للسرعة القصوى التي يطلب عملاؤك الاتصالات بها.إذا انخفض عدد الاتصالات الجاهزة إلى الصفر، فستحتاج إلى رقم N أكبر.إذا كان الرقم مرتفعًا باستمرار (على سبيل المثال أعلى من 10)، فأنت بحاجة إلى رقم N أقل.

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

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

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

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

يقوم Jakarta Commons DBCP بالفعل بتنفيذ جميع الأشياء التي ذكرتها:

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

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

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

ومع ذلك، فإن استخدام Commons DBCP أمر قابل للنقاش بناءً على إجابات هذا و هذا أسئلة.هناك بدائل أفضل مذكورة هناك مثل c3po أو com.proxool.

أو يمكنك استخدام آلية تجميع الاتصال المعتمدة على rdbms.

لست متأكدًا من السياق الذي تستخدم فيه اتصالاتك ولكن يمكنني مشاركة ما يبدو أنه يناسبني.

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

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

ومع ذلك، نعلم جميعًا أننا بحاجة إلى الوصول إلى قاعدة البيانات الخاصة بنا والكتابة إليها في مرحلة ما، لذلك أتبع مبدأين:

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

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

    • إحدى الطرق التي استخدمتها هي تمرير كائنات الاتصال الخاصة بي إلى أسفل الأنبوب بحيث يمكن لجميع الكائنات استخدام كائن اتصال واحد.يؤدي هذا إلى فتح وإغلاق اتصال واحد بدلاً من 10 أو أكثر اعتمادًا على تطبيقك.أحد الأمثلة الجيدة على ذلك هو أحد نماذج الشراء لدينا التي تستفيد من قوة خادم SQL لجمع الإحصائيات وتقسيم أنماط الطلب المعقدة.ليس من المنطقي الاستمرار في فتح الاتصال وإغلاقه عندما تقوم بإجراء بحث يزيد عن 200 ألف قاعدة بيانات أو أي شيء مخصص للتطبيقات.الجزء الآخر من ذلك هو أنه عندما أستخدم كائنًا، أحاول تجميع تحديثاتي لتقليل الوقت الذي أبقي فيه الاتصال مفتوحًا.لذا، فإن إجراء domain_identity عند استدعاء الإدراج يتيح لي الاهتمام بكل من الإدخال والبحث عن المعرف الفريد لإضافته إلى الكائن الخاص بي قبل تخزينه مؤقتًا.في اليوم الذي كنت أقوم فيه بتطوير تطبيقات asp لأول مرة، كنت أفتح الاتصال بمجرد بدء تحميل الصفحة ثم أغلقه بعد ذلك.لا أوصي بفعل ذلك بعد الآن.الآن هناك فائدة كبيرة لهذه الأنواع من التجريدات والطبقات التي أوصي أي مبرمج مبتدئ بالاهتمام بها بعناية.

سنتى:

تخزين البيانات الخاصة بك!تخزين البيانات الخاصة بك!تخزين البيانات الخاصة بك!قم بأقل قدر ممكن من الوصول إلى قاعدة البيانات عندما لا تتمكن من تخزين بياناتك مؤقتًا ثم تخزينها مؤقتًا!

لماذا إعادة اختراع العجلة؟

ربما قام شخص ما بحل المشكلة بالفعل، بل وأفضل.

إذا كنت في عالم Java، فيمكنك استخدام كومنز DBCP.

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