لن تغلق الاتصالات عند استخدام ربط المعاملة = غير صريح ؛ في سلسلة الاتصال

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

سؤال

أنا استخدم Transaction Binding=Explicit Unbind في سلسلة الاتصال على النحو الموصى به هنا منذ أن استخدمت أيضًا TransactionsCope مع مهلة. المشكلة هي أن الاتصالات لا يبدو أنها تغلق بعد التخلص منها وفي النهاية لا توجد اتصالات متاحة في مجموعة الاتصال. حصلت على نفس النتيجة عندما قمت بتعديل TransactionTimeOtissuedEmo (انظر الرابط) وقمت بتشغيل TransactionScopetest () (مع سلسلة اتصال غير صريحة) مرات كافية في حلقة لاستخدام جميع الاتصالات المتاحة في تجمع الاتصال. القيمة الافتراضية للاتصالات في التجمع هي 100 ولكن يمكن تغيير هذا باستخدام الإعداد Max Pool Size =10 على سبيل المثال. يبدو أن الاتصالات لن يتم إصدارها عند استخدام UNFRINC الصريح على الرغم من استخدام كل من SQLConnection و TransactionsCope مع using بند. أي شخص يعرف كيف يتعامل مع هذا؟

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

المحلول

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

يتمثل الحل البديل في هذه المشكلة في مسح تجمع الاتصال في حالة حصولك على استثناء مثل هذا:

using (SqlConnection con = new SqlConnection(connectionString))
{
    con.Open();
    try
    {
        Console.WriteLine("Server is {0}", con.ServerVersion);
        Console.WriteLine("Clr is {0}", Environment.Version);
        for (int i = 0; i < 5; i++)
        {
            using (SqlCommand cmd = con.CreateCommand())
            {
                cmd.CommandText = "insert into TXTEST values ( " + i + " )";
                cmd.ExecuteNonQuery();
            }
            Console.WriteLine("Row inserted");
        }
        Thread.Sleep(TimeSpan.FromSeconds(1));
    }
    catch
    {
        SqlConnection.ClearPool(con);
        throw;
    }
}

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

هذا حل قبيح ولكن يبدو أنه يعمل.

نصائح أخرى

لما يستحق ، تم إصلاح هذه القضية في .NET 4.0.

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