كيف يمكنني تتبع اتصالات JDBC الأيتام التي لم يتم مغلقة؟

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

  •  06-07-2019
  •  | 
  •  

سؤال

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

وعلة يشبه أساسا قص ولصق خطأ. لدينا عدد قليل من الطبقات التي تدير اتصال DB، بحيث يبدو تقريبا مثل هذا:

OurDBConn conn1 = ConnectionManager.getConnection();
try {
  // business logic
} catch () {
  //
} finally {
  ConnectionManager.returnConnection(conn1);
}

/// and then later in the same method
OurDBConn conn2 = ConnectionManager.getConnection();
try {
  // business logic
} catch () {
  //
} finally {
  ConnectionManager.returnConnection(conn1); // NOTE Error: conn1 should be conn2
}

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

و(بداية تحرير / إلحاقي)

نعم، رمز اتصال لنا أيضا وحتى أتمكن من استخدام الإجابات الممنوحة.

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

واحدة من السؤال الذي يجب أن يطرح هنا هو: كيف سيكون هؤلاء الأيتام، وصلات مغلقة الامم المتحدة تعبر عن نفسها في أداء النظام؟ أيضا، لأن هذه الكائنات الاتصال لا توجد إلا في نطاق أسلوب معين، لن الاتصالات تكون مؤهلة لجمع القمامة؟ ثم إذا gc'ed أنها، ما هو تأثير الاتصالات المفتوحة التي gc'ed؟

و(نهاية تحرير)

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

المحلول

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

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

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

نصائح أخرى

ويمكنك تطبيق مخصص مصغرة إطار أو استخدام أحد exisitng كما مجمع رقيقة على عمليات JDBC. على سبيل المثال هناك الربيع جدبك حدة ( mavenized ) التي تغطي كافة التعليمات البرمجية النمطي عرضة للخطأ من المطور.

ويمكنك التحقق من استخدامه أمثلة ونرى أنه لا يوجد التهيئة / تنظيف في رمز العميل على الإطلاق! ويستخدم <م> 'طريقة قالب' نمط، أي تكتب فقط معالجة البيانات الأساسية ولا تهتم اتصالات / البيانات / إنشاء resultsets والإغلاق. لذلك، يصبح من غير الممكن أن يعرض المشكلة التي تحدث في البداية.

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