سؤال

أنا أستخدم حاليًا Singleton على تطبيق الويب الخاص بي بحيث لا يوجد دائمًا اتصال واحد فقط بقاعدة البيانات.

أريد أن أعرف ما إذا كانت هذه فكرة جيدة لأنني الآن أواجه مشكلة في هذا الخطأ:

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

نقطة أخرى مهمة هي أن موقع الويب الخاص بي موجود حاليًا في Dev وليس هناك الكثير من الناس حتى لا أفهم لماذا أحصل على هذا الخطأ!

إليكم رمز المفرد الخاص بي:

using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using System.Data.SqlClient;

/// <summary>
/// This class take care of all the interaction with the database
/// </summary>
public class DatabaseFacade
{
    SqlConnection m_conn = null;

    string m_csLanguageColumn;

    //Variables that implement the Singleton pattern
    //Singleton pattern create only one instance of the class
    static DatabaseFacade instance = null;
    static readonly object padlock = new object();

    /// <summary>
    /// Private constructor. We must use Instance to use this class
    /// </summary>
    private DatabaseFacade()
    {
    }

    /// <summary>
    /// Static method to implement the Singleton
    /// </summary>
    public static DatabaseFacade Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new DatabaseFacade();
                }
                return instance;
            }
        }
    }

    /// <summary>
    /// Do the connection to the database
    /// </summary>
    public void InitConnection(int nLanguage)
    {
        m_conn = new SqlConnection(GetGoodConnectionString());

        try
        {
            //We check if the connection is not already open
            if (m_conn.State != ConnectionState.Open)
            {
                m_conn.Open();
            }

            m_csLanguageColumn = Tools.GetTranslationColumn(nLanguage);

        }
        catch (Exception err)
        {
            throw err;
        }
    }
}

شكرا لمساعدتك!

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

المحلول

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

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

بدلاً من استخدام اتصال واحد ، يجب عليك فقط إنشاء كائنات اتصال جديدة عند الحاجة إليها ، للاستفادة من تجميع الاتصال.

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


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

هناك العديد من أسئلة الفائض الجيدة التي تناقش هذا ، والتي أظن أنها قد تكون مفيدة!

نصائح أخرى

لا ، إنها فكرة سيئة. يمكنك استخدام تجميع الاتصال.

السبب في أن استخدام اتصال بقاعدة البيانات كقاعدة مفردة هو فكرة مروعة ، هو أن كل اتصال 2+ سيتعين على الانتظار حتى يتم إصدار الاتصال الأول.

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

هذه أخبار سيئة.

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

أغلى عملية في كائن اتصال قاعدة البيانات ، هي الفعلية الإتصال. ليس الخلق.

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