2009-01-06 101 views
1

我有一个最多由10个客户端调用的web服务。该webservice由7个不同的asmx页面构成,每页有大约100-200个功能。在webservice中处理sql-connections的最佳方法是什么?

所有这些函数都针对MSSQL2005或MS SQL2000数据库。在一天中的某些时段,来自客户端的流量很大,似乎我的sql服务器上的连接用完,导致所有客户端停止。

在每一个函数中,我打开一个连接,执行这些操作,然后关闭连接,有时候事务处理有时不会。

在服务器上,我发现它创建了很多连接,我不知道为什么它们不会消失,但是即使在函数完成并结束后,它仍然保留在那里。所以我可以确保我的10位客户不时创建超过80个连接。有时候他们中的一些人会消失,有时他们在使用后还有几个小时。那里是否有某种集合?

问题1: 是否有另一种方法来处理我应该使用的连接,如每个Web服务或其他任何方式的全局连接?

问题2: 如果它可以处理每个函数的连接,那么为什么它不关闭服务器上的连接,使得打开的连接列表一直越来越大,直到我失去连接 - 错误?

这个问题是关系到我的其他问题,但不一样的:Strange SQL2005 problem. "SqlConnection does not support parallel transactions"

我现在已经缩小下来的“出连接”的错误。

+0

您是否使用Windows身份验证,并通过客户的身份,还是您的Web服务已经使用的每一个连接一个用户名/密码?我认为前者会影响ASP.NET集中连接的能力。 – 2009-01-06 19:56:14

+0

WebService的有用于创建所有连接一个ConnectionString的。没有Windows验证。 – Stefan 2009-01-06 20:49:31

回答

4

我同意有关重构的评论,但这不是相关的问题。

你绝对应该在每个函数中使用一个连接,听起来好像你没有正确处理它们。假设数据库操作包含在您要调用的函数中,您的代码应该如下所示:

using (SqlConnection connection = <connection code>) 
{ 
    using (SqlCommand command = <command code>) 
    { 
    // Execute. 
    } 
} 

在服务器端,连接将保持打开状态。默认情况下,SqlConnection类启用连接池,因此您将在服务器端看到连接打开。

此行为是正常现象,应该是预期的。

0

因此,这是700-1400功能在一个单一的Web服务?听起来对我来说太大了。时间重构。

我不知道页面和Web服务之间的连接是什么。我通常认为它们是XML消息传递端点,与消耗它们的客户端完全分开。

+0

它的一个大系统与许多不同的客户端,以便它有它必须有大小。所有功能都不是全部使用,而是任何“某个时间”。 – Stefan 2009-01-06 20:48:40

3

您实际上正在看到连接池正在运行。这在默认情况下发生在.Net 2+到SQL 2005(不确定其他版本)。

连接池意味着.Net会为你保留一些连接,这样当你下一次需要连接时,开销就会减少。 CLR可以给你一个已经打开(和清理)的连接,比直接重新连接数据库快几百倍。当您调用connection.Close()时,您只需将连接回传到池中进行回收。

池存在每个单独的安全上下文连接 - 这意味着所有连接使用相同的SQL安全将共享一个游泳池,而如果你使用的是Windows身份验证,连接将有自己的游泳池每个用户发。

您所看到的问题,因为你打100间的连接 - 在池的默认最高金额(默认最小为0)。此时池将无法提供另一个连接到一个已经被回收,因此应用程序将挂起或超时。您需要更改连接字符串以包含更高的最大数量(并且还要考虑切断连接)。