同时在多个方法之间共享单个数据库连接

时间:2010-02-08 14:20:01

标签: asp.net database

我有一个页面,用户可以在其中插入某些产品的订单。在该页面中还有实时统计信息,每20秒刷新一次以反映使用asp.net计时器的产品的当前价格。这个实时面板从数据库中获取这些价格。

有时插入订单时,我会收到一个异常,说连接已关闭且insert命令无法继续。我怀疑当给出insert命令时,如果在那个确切时刻刷新实时更新,那么他们都需要访问数据库,并且他们使用相同的SqlConnection对象。因此,当一个完成时,即使另一个连接对象使用相同的连接对象,连接对象也会被关闭。

在关闭连接之前,我怎样才能确定没有其他方法正在使用该连接?

下面给出了我的连接类的代码,以便更好地说明 -

using System;
using System.Collections.Generic;
//using System.Linq;
using System.Text;
using System.Data;
using System.Data.SqlClient;
using System.Configuration;
using System.Collections.Specialized;
using System.IO;
using System.IO.Ports;


public class ConnectionHelper
{

#region Private Variables
static string BOconnectionString = "";
static SqlConnection BOcon = null;
static string STRSconnectionString = "";
static SqlConnection STRScon = null;
static SqlTransaction tSTRSTrans = null;

public static SqlTransaction STRSTrans
{
    get { return ConnectionHelper.tSTRSTrans; }
    set { ConnectionHelper.tSTRSTrans = value; }
}
#endregion


#region Constructor
ConnectionHelper() { }
#endregion



#region Public Functions 

public static SqlConnection getSTRSConnection()
{
    STRSconnectionString = ConfigurationManager.ConnectionStrings["STRS_WEB_DB2ConnectionString"].ConnectionString;
    try
    {
        if ((STRScon == null) || (STRScon.State == ConnectionState.Closed))
        {
            STRScon = new SqlConnection(STRSconnectionString);
            STRScon.Open();
            //tSTRSTrans = STRScon.BeginTransaction(IsolationLevel.RepeatableRead);
        }


    }
    catch (Exception ex)
    {
        throw new Exception("Error occurred when Connection is going to be opened" + ex.Message);
    }
    return STRScon;
}
public static void closeSTRSConnection()
{
    if ((STRScon != null) || (STRScon.State == ConnectionState.Open))
    {
        STRScon.Close();
    }        
}

#endregion

}

如果方法想要访问数据库,他们将以下列方式获取和关闭连接 -

con = ConnectionHelper.getSTRSConnection();
........
........
ConnectionHelper.closeSTRSConnection();

4 个答案:

答案 0 :(得分:3)

创建新对象,不要共享对象。 ADO.net处理连接池,您不必自己尝试。

答案 1 :(得分:2)

我认为您不应该将此方法用于Web应用程序,我认为您的意图是利用公共连接,但考虑重构您的代码,以便不使用现有连接,即“getSTRSConnection”,而是简单的打开连接|做你的工作并关闭它。作为一般做法,尽可能晚地打开连接是一个好主意,然后在工作完成后立即关闭连接是另一个好主意。请记住,这些连接是一种昂贵的资源,只有在需要将信息保存到数据库时才能生存。

答案 2 :(得分:1)

连接池是一件好事,但我建议不要试图自己管理连接池并让引擎为你管理它。

Understanding Connection Pooling in .NET
 Tuning Up ADO.NET Connection Pooling in ASP.NET Applications

答案 3 :(得分:1)

为多用户环境建立一个连接是个坏主意。当您为所有用户使用一个连接时,如果某人执行了需要的操作,比如说15秒,只是为了数据库访问,所有其他用户都必须等待才能连接到数据库。