使用一个单独的连接在ASP.NET网站是个好主意(Is using a singleton for

2019-07-22 17:24发布

我目前使用我的web应用程序单,以便有永远只有一个连接到数据库。

我想知道这是否是因为现在我有与错误的麻烦是一个好主意:

超时过期。 之前从池中获取连接超时时间已过。 出现这种情况可能是因为所有池的连接正在使用,并且达到最大池大小。

另外重要的一点是,我的网站目前在开发中并没有很多人在上面走,所以我不明白为什么我得到这个错误!

这是我单身的代码:

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;
        }
    }
}

谢谢你的帮助!

Answer 1:

使用单个连接是一个非常糟糕的主意 - 如果访问连接正确锁定,这意味着ASP.NET只能在同一时间,这将严重限制了你的应用程序的增长能力服务于一个用户。

如果连接正确锁定,事情可能变得很怪异。 例如,而另一个线程试图反对执行一个命令一个线程可以处理的连接。

不要使用单个连接的,你应该只在需要的时候,把连接池的优势,创建新的连接对象。

连接池是对的SqlClient类的默认行为 (以及可能的其他数据提供者)。 当您使用连接池,你任何时候“创造”的连接,该连接实际上会从现有的池中取出,这样你就不会招致构建每次一个从无到有的成本。 当你释放它(将其关闭或进行处置),就可以返回到连接池,让您的连接相对较低的总数。


编辑:你会看到你所提到的错误,如果你不关闭(或处置)的连接( 之前从池中获取连接超时时间已过 )。 请确保你这样做,只要你使用的每一个连接完成。

有几个很好的堆栈溢出问题,讨论这个,我怀疑可能是有帮助!

  • 为什么不是设置的SqlConnection /关闭?
  • 什么是确保SQL连接时抛出一个异常关闭的正确方法?


Answer 2:

不,这是一个坏主意。 您可以使用连接池。



Answer 3:

为什么使用连接到数据库作为一个单身是一种可怕的想法,究其原因是因为每2 +连接接下来要等待要发布的第一个连接。

单身意味着只有一个数据库连接对象,连接到数据库。 因此,如果第二人想连接到它,他们需要等待,直到他们可以访问该对象。

这是个坏消息。

需要时只要保持创建数据库连接对象,新的实例。 这里的关键是要尽快打开连接尽可能晚,然后关闭连接。

在一个数据库连接对象的最昂贵的操作,是实际的连接 。 不是创造。



Answer 4:

无需一个Singleton。 这里是连接池的一些文章:

.NET 1.1

为.NET Framework数据提供程序SQL Server连接池

.NET 2.0

使用连接池与SQL Server

.NET 3.0

使用连接池

.NET 3.5

SQL Server连接池(ADO.NET)

.NET 4.0

SQL Server连接池(ADO.NET)



文章来源: Is using a singleton for the connection a good idea in ASP.NET website