ADO.NET最大池大小行为

时间:2013-02-24 22:05:35

标签: c# sql-server-2008 ado.net

我正在使用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个同时连接对吗?超时错误仅在我使用浏览器时发生,但在该浏览器上调用方法两次。这是为什么?

2 个答案:

答案 0 :(得分:0)

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

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

以下是MSDN上.NET框架中连接池的lengthy and dry document

答案 1 :(得分:0)

因此,在VS 2010和IIS 7.5中本地调试之间似乎存在差异。我不得不将示例网站部署到IIS,以使最大池大小符合预期。如果我尝试第二次调用click事件,无论我尝试哪个浏览器,它都会抛出超时错误,这是预期的。根据需要执行网站/应用程序池重启/回收以重新测试。

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