对页面的多个无会话请求(与数据库交互)会导致HTTP错误500

时间:2012-02-06 14:35:08

标签: c# asp.net sql-server

我有一个asp.net网页,它与SQL Server数据库交互,抓取一些数据,然后返回一个XML响应(我使用xml_curl将其提供给Freeswitch

因为Freeswitch(FS从现在开始)不存储cookie,所以每个请求都会创建一个新会话。

当请求数量过多(大约97到100)时,SqlConnection.Open()方法从SQL Server实例获取超时,然后导致HTTP错误500.

为了测试我的假设,我使用PHP和cURL创建了一个小脚本,它向我的asp.net页面重复发出请求。如果我在PHP脚本中存储cookie(以及会话),我可以在近314秒内完成10000次成功请求。

但是如果没有会话,我会遇到大约97~100个请求,然后我得到HTTP错误500.

无论如何都要克服这个问题吗?

==编辑==
以下是我与数据库交互的方式:

String connectionString = WebConfigurationManager.ConnectionStrings["SqlServerConnection"].ConnectionString;
SqlConnection connection = new SqlConnection(connectionString);
SqlCommand command = connection.CreateCommand();
command.CommandType = CommandType.Text;
command.CommandText = "Select * from dbo.Template where Name = '" + name + "'";

Template template = new Template();

connection.Open();

SqlDataReader reader = command.ExecuteReader();


if (reader.HasRows)
{
    reader.Read();
    template.Name = reader["Name"].ToString();
    template.XMLContent = reader["XMLContent"].ToString();
}
else
{
    template.Name = "";
    template.XMLContent = "";
}

reader.Close();
connection.Close();

return template;

模板表包含以下字段:

ID => int, identity, primary key
Name => nvarchar(255), unique
XMLContent => ntext

3 个答案:

答案 0 :(得分:3)

您似乎正在使用连接池。默认情况下,这些池与SQL Server最多有100个连接,并为任何其他连接排队。队列具有超时(默认为15秒),如果您希望将请求排长时间,可以将其延长。这意味着您可能会在服务器上备份。如果SQL服务器可以处理它,您还可以增加池最大大小。

以下是增加连接设置的方法by adding these parameters:

  • 超时= 60
  • 最大泳池尺寸= 150
  • 等等

答案 1 :(得分:1)

推广此代码的一些步骤。

  1. 如果您不需要会话,请为此页面禁用会话,因此不会进行Cookie。
  2. 根据name使用一些缓存如果名称请求相同,请从缓存中获取,而不是打开数据库
  3. 使用静态变量只读取一次连接字符串。
  4. 将它放在[try catch |使用],以确保在发生故障时关闭连接
  5. 也许您可以尝试使用互斥锁定逻辑,以避免过多的请求。
  6. 在SQL调用中使用参数。

答案 2 :(得分:1)

除了@Aristos的建议:

  • 使用Async-Pages!

Example"Benchmark"

前段时间我几乎问了same question here on so