2013-02-24 65 views
1

我正在使用MSSQL 2008R2。我写了一个C#应用程序和故意没有接近我的SqlConnection。在VS 2010上进行本地调试。以下是我使用的代码:ADO.NET最大池大小行为

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 
    } 

Max Pool Size = 1;期待在第二次浏览器上的第二次点击尝试时出错。 为什么我可以去3个不同的浏览器(Mozilla,Chrome,IE)和每次调用点击方法一次。这相当于3个同时连接的权利?超时错误仅在使用浏览器时发生,但在该浏览器上调用方法两次。为什么是这样?

回答

0

所以似乎有调试之间的差异在本地VS 2010和IIS 7.5。我必须将示例网站部署到IIS以使最大池大小按预期运行。如果我尝试再次调用click事件,无论我尝试使用哪个浏览器,都会引发超时错误,这是预期的。根据需要执行网站/应用程序池重新启动/重新测试。

出于某种原因,本地调试在VS 2010中绕过最大池大小限制。每个浏览器可能会调用点击事件,在我的例子中打开3个sqlconnection对象。唯一一次抛出超时错误的是如果你停留在浏览器中并且通过双击方法。奇怪的行为,但开发人员应该意识到的东西。

0

只是因为你离开了连接对象开放并不意味着三个独立的连接。 .NET框架实际上利用SQL Server中的连接池并通过连接字符串来管理它。由于所有三个请求的连接字符串都是相同的,并且连接可用,所以不存在冲突。

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

下面是连接在MSDN上的.NET框架汇集lengthy and dry document

+0

在您发布的链接,它们包围的SqlConnection对象使用{}块,关闭连接,一旦退出范围,它返回到池中,我的例子没有。连接池将重用连接,但如果我选择不关闭连接,则必须创建另一个池。我的查询很快,只有10位数字返回。 – invulnarable27 2013-02-25 19:44:41

+0

@ invulnarable27:是的,他们正在发布'使用'声明,这是一个很好的做法,所以记住这一点。但是,与你的情况无关。然而,**因为第一个查询是short **,所以当它建立一个新的连接时,它不会在池中创建额外的连接** **请记住,池在连接字符串上工作。如果您要在第一个请求上创建一个*长时间运行的查询*,然后在后续请求上尝试创建另一个连接,则它将按预期失败,因为它需要*从池中获取另一个连接。 * – 2013-02-26 12:27:39

+0

我同意你长时间运行的查询将保持在sqlconnection,导致在后续请求上创建第二个连接。我通过不调用connection.Close()来模拟一个长查询(不确定)。当在IIS中部署时出现错误,VS的行为不正确。 – invulnarable27 2013-02-27 08:18:41