【发布时间】:2016-01-13 12:01:46
【问题描述】:
首先,我意识到我的问题可能很宽泛,请多多包涵,因为我已经思考了一个月如何形成它,但我仍然不能 100% 确定如何表达我的问题。
我目前正在开发一个网站,每天将有成千上万的用户使用该网站。瓶颈是与数据库的通信。
与表的每次对话都是通过存储过程完成的,其调用如下所示:
public void storedProcedure(int id, out DataSet ds)
{
ds = new DataSet("resource");
SqlDataReader objReader = null;
SqlCommand cmd = new SqlCommand("storedProcedure", DbConn.objConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@id", id));
openConnection(cmd);
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = cmd;
objDataAdapter.Fill(ds);
cmd.Connection.Close();
}
或者
public void anotherStoredProcedure(int var1, int var2, int var3, int var4, string var5, out DataSet ds)
{
ds = new DataSet("ai");
SqlCommand cmd = new SqlCommand("anotherStoredProcedure", DbConn.objConn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@var1", var1));
cmd.Parameters.Add(new SqlParameter("@var2", var2));
cmd.Parameters.Add(new SqlParameter("@var3", var3));
cmd.Parameters.Add(new SqlParameter("@var4", var4));
cmd.Parameters.Add(new SqlParameter("@var5", var5));
openConnection(cmd);
SqlDataAdapter objDataAdapter = new SqlDataAdapter();
objDataAdapter.SelectCommand = cmd;
objDataAdapter.Fill(ds);
cmd.Connection.Close();
}
我的 objConn 定义如下:
public static string DatabaseConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["objConnLocal"].ConnectionString;
public static SqlConnection objConn = new SqlConnection(DatabaseConnectionString);
当然在 web.config 我有
<add name="objConnLocal" connectionString="Initial Catalog=t1;Data Source=1.2.3.4;Uid=id;pwd=pwd;Min Pool Size=20;Max Pool Size=200;" providerName="SQLOLEDB.1"/>
现在的问题是:在每个 page_load 上都有一些 sp 调用(上图),当用户开始浏览页面时,会进行更多调用。
目前只有开发和测试团队在网站上,有时速度真的很慢。通常它会一直加载直到超时(错误 504)。
第一次用户登录时的另一个问题(只是偶尔出现,但肯定频繁到足以引起注意)是它会继续尝试运行呼叫,但连接会声称已打开,即使它不应该打开。一个相当无效的解决方法是
private void openConnection(SqlCommand cmd){
if (cmd.Connection.State != ConnectionState.Closed)
{
cmd.Connection.Close();
}
if (cmd.Connection.State == ConnectionState.Open)
{
cmd.Connection.Close();
}
try
{
cmd.Connection.Open();
}
catch (Exception ex)
{
System.Threading.Thread.Sleep(1000);
HttpContext.Current.Response.Redirect("/");
}
}
这使得连接速度变慢,但至少不显示 YSOD。
那么,我在我的 SQL 调用上做错了什么,以至于只有 5-10 个用户的速度如此之慢?到目前为止我所拥有的: 我在 Stack Overflow 上读到使用“使用”非常好,但我不完全确定为什么以及如何出现,因为它是答案下的单行注释。另一个改进的想法是使用多个连接字符串,而不仅仅是一个。
已解决:
将连接字符串中的等待连接建立从用户名/密码更改为集成安全解决了该问题。如果有人遇到类似问题,请参考http://www.codeproject.com/Articles/17768/ADO-NET-Connection-Pooling-at-a-Glance
【问题讨论】:
标签: c# sql asp.net sql-server stored-procedures