Sql server 在webservice中处理sql连接的最佳方法?
我有一个Web服务,最多可由10个客户端调用。Web服务由7个不同的asmx页面组成,每个页面中有大约100-200个功能 所有这些函数都针对MSSQLS2005或MSSQLS2000数据库工作。一天中的某些时段,来自客户端的流量非常大,似乎sql server上的连接耗尽,导致所有客户端停止 在每一个函数中,我打开一个连接,做一些事情,然后关闭连接,有时有事务,有时没有事务 在服务器上,我看到它创建了很多连接,我不知道为什么它们不会消失,但即使在功能完成后,它们仍会留在那里。因此,我可以确信,我的10个客户不时会创建80多个连接。有时它们会消失,有时在使用几个小时后仍然存在。那里有没有什么共同点 问题1: 有没有其他方法可以处理我应该使用的连接,比如每个Web服务全局处理一个连接或者其他任何方法 问题2: 如果可以处理每个函数的连接,那么为什么它不关闭服务器上的连接,使打开的连接列表越来越大,直到我退出连接错误 这个问题与我的另一个问题有关,但不相同: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服务中有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服务使用了一个用户名/密码