我有一个页面,用户可以在其中插入某些产品的订单。在该页面中还有实时统计信息,每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();
答案 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秒,只是为了数据库访问,所有其他用户都必须等待才能连接到数据库。