2009-10-13 28 views
4

一个好主意,我目前使用一个单上我的web应用程序的连接,以便有永远只有一个连接到数据库。是使用单在ASP.NET网站

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

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

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

这是我单身的代码:

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

感谢您的帮助!

回答

17

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

如果连接是而不是正确锁定,事情会变得非常奇怪。例如,一个线程可能会在另一个线程试图对其执行命令时处置该连接。

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

连接池是the default behavior for the SqlClient classes(和可能的其它数据提供者)。当您使用连接池时,只要您“创建”连接,连接实际上都会从现有池中提取,这样您就不会每次都从头开始构建一个连接。当你释放它(关闭它或处理它)时,你将它返回到连接池,保持连接总数相对较低。


编辑:你会看到你所提到的错误,如果你不关闭(或处置)的连接(之前从池中获取连接经过超时时间)。确保您在完成每个连接后立即执行此操作。

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

+2

虽然我同意单身人士是一个SqlConnection坏主意,我没有看到任何迹象表明,它将被限制为一个单一的请求。代码中没有锁定会阻止SqlConnection对象的多个用户(如果有的话,由于线程问题使得它更糟糕)。 – 2009-10-13 00:21:32

+0

@马克,德哦!我在没有通读整个代码的情况下写了这篇文章,假设有锁定限制使用Connection!正如你注意到的那样,这可能会导致完全不同的问题。我已经更新了我的答案以反映这一点。 – 2009-10-13 01:02:09

+0

谢谢你们!非常快速和明确的答案。这将很容易解决这个问题!再次感谢! – 2009-10-13 10:34:08

6

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

+0

不可能把它放在任何更好的自己。 :-P – jrista 2009-10-13 00:12:14

+1

解释本来不错。 – 2009-10-13 00:12:36

+0

@Robert,同意了。据此下调。 – 2009-10-13 02:51:42

4

之所以使用作为一个单身一个连接到数据库是一个可怕的想法,是因为每2 +连接接下来要等待第一个连接是释放。

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

这是个坏消息。

仅在需要时才继续创建数据库连接对象的新实例。这里的诀窍是尽可能晚地打开连接,然后尽快关闭连接。

数据库连接对象中最昂贵的操作是实际的连接。而不是创作。