سؤال

نواجه مشكلة مع جافا ويب التطبيق قيد التشغيل في غضون هر 6 يستخدم JDBC الاتصال إلى قاعدة بيانات SQL Server.

بعد بضعة طلبات ملقم التطبيق يموت في ملفات السجل نجد استثناءات تتعلق اتصال قاعدة البيانات فشل.

نحن لا تستخدم أي تجمع الاتصال الآن ونحن نستخدم معيار JDBC/ODBC/ADO سائق جسر للاتصال بـ SQL Server.

يجب علينا النظر في استخدام تجمع الاتصال للقضاء على هذه المشكلة ؟

أيضا, يجب علينا تغيير السائق إلى شيء من هذا القبيل jTDS?

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

المحلول

وهذا هو السلوك الصحيح إذا كنت لا إغلاق اتصالات JDBC الخاص بك.

لديك لاستدعاء الأسلوب قريب () لكل مورد JDBC عند الانتهاء من استخدامه وغيرها من الموارد JDBC حصلت معها.

وهذا ينطبق على اتصال، بيان / PreparedStatement / CallableStatement، resultset و، وما إلى ذلك.

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

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

ويمكنك أيضا أن تلاحظ بك INSERT / UPDATE / حذف البيانات شنقا إذا فشلت في ارتكاب () أو التراجع () في ختام كل معاملة، إذا لم تكن قد تعيين الخاصية AUTOCOMMIT إلى true.

وما رأيته هو أنه إذا كنت تطبيق الصرامة المذكورة أعلاه إلى رمز العميل JDBC الخاص بك، ثم JDBC والخادم SQL الخاص بك سوف تعمل بشكل رائع على نحو سلس. إذا كنت أكتب حماقة، ثم كل شيء سوف تتصرف مثل حماقة.

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

وهذا صحيح، ولكن تلك المبرمجين وقد كتبت برامجها للعب "99 زجاجات من البيرة على الجدار" مع خادم (ق).

وسوف الموارد تصبح استنفاد وسوف طلبات تميل إلى يسفر عن واحد أو أكثر من وقوع التالية: طلبات الاتصال تفشل فورا، وبيانات SQL تفشل فورا أو شنق إلى الأبد أو حتى انتهاء صلاحية بعض godawful مطول توقيت مهلة المعاملة، الخ

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

وأسرع طريقة لحلها هو لاطلاق النار على الرجل الذي كتب JDBC يدعو في التطبيق الخاص بك التي تتحدث إلى خادم SQL الخاصة بك مع نبله [نرف]. عندما يقول "ماذا نفعل ذلك ...؟!" مجرد الإشارة إلى هذا المنصب، وأقول له لقراءته. (تذكر لا لاطلاق النار للعيون، والأمور في يديه، الاشياء التي قد تكون خطيرة / هشا، الخ.)

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

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

نصائح أخرى

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

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

فإنه من الصعب أن أقول حقا لأنك قد قدمت القليل من المعلومات عن الفشل الفعلي:

بعد بضعة طلبات التطبيق خادم يموت في ملفات السجل نجد استثناءات تتعلق قاعدة البيانات فشل الاتصال.

يمكنك أن تقول لنا:

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

كنت قد كتبت الكثير من قواعد البيانات ذات الصلة كود جافا (تقريبا كل رمز قاعدة البيانات ذات الصلة), تستخدم MS السائق ، jdt سائق واحد من jnetDirect.

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

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