Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 在webservice中处理sql连接的最佳方法?_Sql Server_Connection Pooling_Sqlconnection - Fatal编程技术网

Sql server 在webservice中处理sql连接的最佳方法?

Sql server 在webservice中处理sql连接的最佳方法?,sql-server,connection-pooling,sqlconnection,Sql Server,Connection Pooling,Sqlconnection,我有一个Web服务,最多可由10个客户端调用。Web服务由7个不同的asmx页面组成,每个页面中有大约100-200个功能 所有这些函数都针对MSSQLS2005或MSSQLS2000数据库工作。一天中的某些时段,来自客户端的流量非常大,似乎sql server上的连接耗尽,导致所有客户端停止 在每一个函数中,我打开一个连接,做一些事情,然后关闭连接,有时有事务,有时没有事务 在服务器上,我看到它创建了很多连接,我不知道为什么它们不会消失,但即使在功能完成后,它们仍会留在那里。因此,我可以确信,

我有一个Web服务,最多可由10个客户端调用。Web服务由7个不同的asmx页面组成,每个页面中有大约100-200个功能

所有这些函数都针对MSSQLS2005或MSSQLS2000数据库工作。一天中的某些时段,来自客户端的流量非常大,似乎sql server上的连接耗尽,导致所有客户端停止

在每一个函数中,我打开一个连接,做一些事情,然后关闭连接,有时有事务,有时没有事务

在服务器上,我看到它创建了很多连接,我不知道为什么它们不会消失,但即使在功能完成后,它们仍会留在那里。因此,我可以确信,我的10个客户不时会创建80多个连接。有时它们会消失,有时在使用几个小时后仍然存在。那里有没有什么共同点

问题1: 有没有其他方法可以处理我应该使用的连接,比如每个Web服务全局处理一个连接或者其他任何方法

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

这个问题与我的另一个问题有关,但不相同:


我现在将其缩小到“连接中断”错误。

那么单个web服务中有700-1400个函数?听起来太大了。是时候重构了


我不知道网页和web服务之间的联系是什么。我通常认为它们是XML消息传递端点,与使用它们的客户端完全分离

那么单个web服务中有700-1400个功能?听起来太大了。是时候重构了


我不知道网页和web服务之间的联系是什么。我通常认为它们是XML消息传递端点,与使用它们的客户端完全分离

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

您肯定应该在每个函数中使用一个连接,而且听起来您没有正确地处理它们。假设数据库操作包含在您调用的函数中,那么您的代码应该如下所示:

using (SqlConnection connection = <connection code>)
{
  using (SqlCommand command = <command code>)
  {
    // Execute.
  }
}
使用(SqlConnection=)
{
使用(SqlCommand=)
{
//执行。
}
}
在服务器端,连接将保持打开状态。默认情况下,SqlConnection类启用连接池,因此您将看到连接在服务器端打开


这种行为是正常的,应该是意料之中的。

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

您肯定应该在每个函数中使用一个连接,而且听起来您没有正确地处理它们。假设数据库操作包含在您调用的函数中,那么您的代码应该如下所示:

using (SqlConnection connection = <connection code>)
{
  using (SqlCommand command = <command code>)
  {
    // Execute.
  }
}
使用(SqlConnection=)
{
使用(SqlCommand=)
{
//执行。
}
}
在服务器端,连接将保持打开状态。默认情况下,SqlConnection类启用连接池,因此您将看到连接在服务器端打开


这种行为是正常的,应该是预期的。

您实际上看到连接池正在运行。默认情况下,在.NET2+到SQL2005中会发生这种情况(不确定其他版本)

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

每个单独的安全上下文连接都有一个池-这意味着使用相同SQL安全性建立的所有连接都将共享一个池,而如果使用Windows身份验证,则每个单独的用户连接都将有自己的池


您看到的问题是因为您正在达到100个连接—池中的默认最大连接数(默认最小连接数为0)。此时,池将无法提供另一个连接,直到一个连接被回收,因此应用程序将挂起或超时。您需要更改连接字符串以包含更高的最大数量(同时还要考虑减少连接)。

您实际上看到了连接池的运行。默认情况下,在.NET2+到SQL2005中会发生这种情况(不确定其他版本)

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

每个单独的安全上下文连接都有一个池-这意味着使用相同SQL安全性建立的所有连接都将共享一个池,而如果使用Windows身份验证,则每个单独的用户连接都将有自己的池


您看到的问题是因为您正在达到100个连接—池中的默认最大连接数(默认最小连接数为0)。此时,池将无法提供另一个连接,直到一个连接被回收,因此应用程序将挂起或超时。您需要更改连接字符串以包含更高的最大数目(同时还要考虑减少连接)。

您使用的是Windows身份验证和传递客户端的身份,还是web服务使用了一个用户名/密码