أفضل طريقة للتعامل مع-اتصالات SQL في خدمة الإنترنت؟

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

سؤال

ولدي خدمة ويب الذي يسمى بنسبة تصل إلى 10 عملاء. هو مبني على خدمة ويب يتكون من 7 asmx صفحات differnet. وولها حوالي 100-200 وظائف في كل صفحة.

و

وجميع تلك الوظائف تعمل ضد قاعدة بيانات MSSQL2005 أو MS SQL2000. بعض الفترات من اليوم حركة المرور الكثيفة في الفترة من العملاء ويبدو أن أركض من الاتصالات على مزود خادم تسبب كافة عملاء للتوقف.

في كل وظيفة I فتح اتصال، تفعل الاشياء ومن ثم إغلاق الاتصال، وأحيانا مع المعاملات وأحيانا من دون.

في الخادم أرى أنه يخلق الكثير من الاتصالات، وأنا لا أعرف لماذا لا يذهب بعيدا، ولكن يبقى هناك حتى بعد الانتهاء من وظيفة وأكثر. حتى أتمكن من بينها أن موكلي 10 يخلق أكثر من 80 اتصالات من وقت لآخر. أحيانا بعضهم يذهب بعيدا، في وقت كانت لا تزال هناك ساعات بعد استخدامها. هل هناك نوع من تجميع يحدث هناك؟

والسؤال 1: هل هناك طريقة أخرى للتعامل مع اتصالات أود أن استخدام مثل اتصال واحد عالميا في خدمة ويب أو أي طريقة أخرى؟

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

ويرتبط هذا السؤال على سؤالي الآخر ولكن ليس هو نفسه: <لأ href = "https://stackoverflow.com/questions/407320/strange-sql2005-problem-sqlconnection-does-not-support-parallel-transactions "> مشكلة غريبة SQL2005. "SqlConnection لا يعتمد المعاملات المتوازية"

ولقد تضيق عليه الآن وصولا الى "الخروج من اتصالات" خطأ.

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

المحلول

وأوافق على تعليق حول إعادة الهيكلية، ولكن هذا ليس هو القضية ذات الصلة هنا.

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

using (SqlConnection connection = <connection code>)
{
  using (SqlCommand command = <command code>)
  {
    // Execute.
  }
}

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

وهذا السلوك غير طبيعي وينبغي أن يتوقع.

نصائح أخرى

وأنت ترى في الواقع تجمع الاتصالات في العملية. يحدث هذا بشكل افتراضي في صافي 2+ إلى SQL 2005 (غير متأكد من إصدارات أخرى).

وتجمع الاتصالات يعني صافي تعقد فتح اتصالات قليلة بالنسبة لك حتى لا يكون هناك أقل من النفقات العامة عند تتطلب بجانب اتصال. وCLR يمكن أن تعطى فقط لأنك على اتصال مفتوح بالفعل (وتنظيف) التي تبعد بضعة مئات المرات أسرع من إعادة الاتصال بقاعدة البيانات مباشرة. عند استدعاء connection.Close () كنت مجرد تسليم ظهر اتصال إلى تجمع لإعادة التدوير.

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

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

وولهذا 700-1400 وظائف في خدمة ويب واحدة؟ يبدو كبير جدا بالنسبة لي. الوقت لريفاكتور.

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

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