【发布时间】:2015-07-31 15:58:58
【问题描述】:
我用asp.net 创建了一个web 应用程序,大致100 users 正在使用它。
但是,人们有时会收到连接仍处于打开状态的错误消息。表示没有正确关闭。
它出现在随机的地方,不是一个特定的地方,也没有其他错误。
我知道,当我在应用程序中出现错误并且它崩溃而我没有优雅地处理错误时,连接也会保持打开状态,基本上每个人都会因此而崩溃。这让我觉得每个人都使用相同的连接对象,是否有可能 2 个用户可能有完美的时机并同时使用 DB connection 调用函数导致错误?有没有办法确保每个人都使用自己的连接对象,比如把它放在他们的会话中或其他什么?
我希望你能理解我的意思,我不认为发布我的任何代码会有帮助,因为它发生在我项目中的随机位置。
它们使用System.Data.SqlClient 连接到SQL Server。
在产生错误的函数下方查找。该函数由 Page_Load 调用,它之前没有任何内容。
public static SqlConnection conn = new SqlConnection("Data Source=Server00\\SQLEXPRESS;Initial Catalog=r2;Integrated Security=true;Connect Timeout=0");
private void populateGameDrop()
{
try
{
conn.Open();
drop_game.Items.Clear();
SqlCommand cmd = conn.CreateCommand();
Access ac = (Access)Session["Access"];
cmd.CommandText = "Select * from dbo.Games where " + ac.GameQuery;
SqlDataReader r = cmd.ExecuteReader();
while (r.Read())
{
drop_game.Items.Add(new ListItem(r["name"].ToString(), r["Abbr"].ToString()));
}
conn.Close();
}
catch (Exception exc)
{
conn.Close();
Log.Error(exc.ToString());
Session["Error"] = exc.ToString();
Response.Redirect("~/YouBrokeIt.aspx");
}
populateServers();
SetSplitScreen();
}
【问题讨论】:
-
我认为根据每个请求打开和关闭连接是一个好习惯。这个answer 基于实体框架的
DbContext,但我认为它也适用于普通 ADO。 -
抱歉,但无法查明是什么代码 sn-p 导致了这些问题,这个问题实在是太宽泛了。您需要先自己进行更多研究,以便能够告诉我们是什么代码导致了问题
-
添加一些您如何访问
DB的代码您是否使用usingstaments? -
基本建议是:尽可能晚地创建
SqlConnection对象 - 最好在创建使用它的SqlCommand对象之前立即创建,并将它们都包装在using语句中。您应该共享的唯一目标是连接 string. -
static SqlConnection不应该是静态的,它应该在 using stement 中创建
标签: c# asp.net sql-server