许多用户的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个错误。

我是不是完全偏离了我管理人际关系的方式?

许多用户的C#SQL Server连接问题-使用池时性能下降

您可以尝试处理mReader。从技术上讲,当它超出范围时,它应该下降,但更有趣的事情发生了。(mReader.Dispose();)