1

我正在使用 MSSQL 2008R2。我写了一个 C# 应用程序,故意没有 关闭我的 SqlConnection。在 VS 2010 上进行本地调试。以下是我使用的代码:

protected void Button1_Click(object sender, EventArgs e)
    {
        string connectionString = "server=s; database=db; User ID=sa; Password=p; Max Pool Size=1;Connect Timeout=3";
        SqlConnection conn = new SqlConnection(connectionString);
        string query = "SELECT * FROM dbo.Numbers";
        SqlCommand comm = new SqlCommand(query, conn);
        conn.Open();
        SqlDataReader reader = comm.ExecuteReader();
        //reader.Read() and display results to Textbox1.Text
    }

最大池大小 = 1;期望在第二次点击尝试第二次浏览器时出错。为什么我可以转到 3 个不同的浏览器(Mozilla、Chrome、IE)并分别调用一次点击方法。这相当于3个同时连接,对吗?超时错误仅在我使用浏览器时发生,但在该浏览器上调用了两次方法。为什么是这样?

4

2 回答 2

0

因此,在 VS 2010 和 IIS 7.5 中进行本地调试似乎存在差异。我必须将示例网站部署到 IIS 才能使最大池大小按预期运行。如果我尝试再次调用点击事件,无论我尝试使用哪种浏览器,都会抛出超时错误,这是意料之中的。根据需要执行网站/应用程序池重启/回收以重新测试。

出于某种原因,在 VS 2010 中进行本地调试会绕过最大池大小限制。每个浏览器都可以调用 click 事件,在我的示例中会打开 3 个 sqlconnection 对象。它引发超时错误的唯一一次是您留在浏览器中并调用两次 click 方法。奇怪的行为,但开发人员应该注意的事情。

于 2013-02-25T19:52:41.163 回答
0

仅仅因为您打开连接对象并不意味着三个单独的连接。.NET 框架实际上利用了 SQL Server 中的连接池,并通过连接字符串对其进行管理。由于所有三个请求的连接字符串相同 - 并且连接可用 - 没有冲突。

现在,如果您要模拟一种情况,即您在其中一个请求上启动了一个长时间运行的查询,然后尝试再次点击它——您可能会发现它会先等待——您会得到一个超时异常。

这是MSDN 上关于 .NET 框架中的连接池的冗长而枯燥的文档。

于 2013-02-25T16:06:27.797 回答