许多用户的C#SQL Server连接问题-使用池时性能下降
本文关键字:性能 多用户 C#SQL Server 问题 连接 | 更新日期: 2023-09-27 17:58:12
我遇到了一个问题,希望能简单修复。
我有一个C#web服务,通过JSON调用与数据库交互的web方法(使用下面的代码)与之交互。
连接字符串:
<add name="MainConnection"
connectionString="SERVER=10.218.147.71;DATABASE=******;UID=******-web;PWD=******;Pooling=True;Min Pool Size=25;Max Pool Size=250;"
providerName="System.Data.SqlClient" />
方法代码:
public List<MatchmakingSessions> GetMatchmakingSessionsWithSearchQuery(string mThisQuery = "") {
List<MatchmakingSessions> matchmakingsessionsList = new List<MatchmakingSessions>();
SqlConnection mConnection;
SqlCommand mCommand;
try {
using (mConnection = new SqlConnection(ConfigurationManager.ConnectionStrings["MainConnection"].ConnectionString)) {
mCommand = new SqlCommand("SELECT * FROM [MatchmakingSessions] " + mThisQuery, mConnection);
if (mConnection.State == ConnectionState.Closed) {
mConnection.Open();
}
SqlDataReader mReader = mCommand.ExecuteReader();
while (mReader.Read()) {
if (mReader.HasRows) {
MatchmakingSessions mMatchmakingSessions = new MatchmakingSessions();
mMatchmakingSessions.SessionID = (mReader["SessionID"] is DBNull) ? 0 : Int32.Parse(mReader["SessionID"].ToString());
//More DB calls to set properties...
matchmakingsessionsList.Add(mMatchmakingSessions);
}
}
mReader.Close();
}
}
catch (Exception x) {
if (!GGErrorHandler.ContainsRegularTypes(x.Message)) {
BusinessHelper.SendMailMessage(string.Format("<b>Error Message</b>: <br /><br />{0}</br><b>Stack Trace</b>: <br />{1}<br />", x.Message, x.StackTrace));
throw new Exception(GGErrorHandler.GetUserFriendlyError("DefaultErrorMessage", ErrorSource.WebAPI, x.Message));
}
else
throw new Exception(GGErrorHandler.GetUserFriendlyError(x.Message, ErrorSource.WebAPI, x.Message));
}
finally {
mConnection.Close();
mCommand.Dispose();
}
return matchmakingsessionsList;
}
我运行了一个压力测试,只有大约200个用户调用相同的方法,每个用户间隔大约1秒,所有用户同时调用,我开始得到错误:
超时已过期。从池中获取连接之前经过的超时时间。发生这种情况的原因可能是所有池连接都在使用中,并且已达到最大池大小。
最终导致整个网络服务崩溃。
在数据库上运行sp_who2
时,我看到大约250个连接。在运行iisreset
之后,它下降到40个连接。然后在压力测试期间,DB上的CPU达到100%,并最终导致上面的超时问题。web服务似乎也存在高延迟,然后在简单的方法交互中最终出现500个错误。
我是不是完全偏离了我管理人际关系的方式?
您可以尝试处理mReader。从技术上讲,当它超出范围时,它应该下降,但更有趣的事情发生了。(mReader.Dispose();)