我目前在我的网络应用程序中使用单例,因此始终只有一个连接到数据库。
我想知道这是不是一个好主意,因为我现在遇到了这个错误:
超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
另一个重要的一点是,我的网站目前处于开发状态,并没有很多人继续使用它,所以我不明白为什么会出现这个错误!
以下是我的单身人士的代码:
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;
}
}
}
感谢您的帮助!
答案 0 :(得分:19)
使用单个连接是一个非常糟糕的主意 - 如果正确锁定对连接的访问,则意味着ASP.NET一次只能为一个用户提供服务,这将严重限制应用程序的增长能力。
如果连接 没有正确锁定,事情就会变得非常奇怪。例如,一个线程可能会释放连接,而另一个线程正在尝试对它执行命令。
您应该只在需要时创建新的连接对象,而不是使用单个连接,以利用连接池。
连接池是the default behavior for the SqlClient classes(可能还有其他数据提供者)。当您使用连接池时,无论何时“创建”连接,实际上都会从现有连接池中提取连接,这样您就不会每次都从头开始构建连接。当您释放它(关闭它或丢弃它)时,您将它返回到连接池,使您的连接总数相对较低。
编辑:如果您没有关闭(或处置)您的连接,您将看到您提到的错误(从池中获取连接之前经过的超时时间)。确保在使用完每个连接后立即执行此操作。
有几个很好的堆栈溢出问题可以讨论这个问题,我怀疑它可能会有所帮助!
答案 1 :(得分:7)
不,这是一个坏主意。您使用连接池。
答案 2 :(得分:4)
将数据库连接作为单例使用的原因是一个可怕的想法,因为每个第二个+连接都必须等待第一个连接被释放。
单例意味着只有一个数据库连接对象,用于连接到数据库。因此,如果第二个人想要连接到它,他们需要等到他们可以访问该对象。
这是个坏消息。
只需在需要时继续创建数据库连接对象的新实例。这里的技巧是尽可能晚地打开连接,然后尽快关闭该连接。
数据库连接对象中最昂贵的操作是实际的连接。不是创造。
答案 3 :(得分:3)
不需要单身人士。以下是一些关于连接池的文章:
.NET 1.1
Connection Pooling for the .NET Framework Data Provider for SQL Server
.NET 2.0
Using Connection Pooling with SQL Server
.NET 3.0
.NET 3.5
SQL Server Connection Pooling (ADO.NET)
.NET 4.0