0

当客户端执行一个简单的选择查询时,我试图了解后台发生了什么。

我正在使用 C# Asp.Net Webforms,并使用 WireShark 检查了进程。

在这里输入

public DBC(string procedureName, params object[] procParams)
{
    strError = null;
    using (MySqlConnection connection = new MySqlConnection(GetConnectionString()))
    {
        connection.Close();
        try
        {
            connection.Open();
            MySqlCommand cmd = new MySqlCommand(procedureName, connection);
            cmd.CommandType = CommandType.StoredProcedure;

            //if we use params for stored procedure
            if (procParams != null)
            {
                int i = 1;
                foreach (object paramValue in procParams)
                {
                    cmd.Parameters.Add(new MySqlParameter("@param_" + i, paramValue.ToString()));
                    i++;
                }
            }

            if (procedureName.Contains("get"))
            {
                dtLoaded = new DataTable();
                dtLoaded.Load(cmd.ExecuteReader());
            }
            else
            {
                cmd.ExecuteNonQuery();
            }
        }
        catch (Exception ex)
        {
            strError = ErrorHandler.ErrorToMessage(ex);
        }
        finally
        {
            connection.Close();
            connection.Dispose();
        }
    }
}

这是一个简单的SELECT * FROM TABLE查询,在 try-catch 语句中。在 finally 状态下,连接被关闭并释放。

为什么会导致43进程?我不明白,为什么有这么多。有人可以解释一下吗?

非常感谢!

4

1 回答 1

2

我假设您使用的是 Oracle 的 Connector/NET。它在打开连接后执行许多非严格必要的查询,例如,SHOW VARIABLES检索一些服务器设置。(在 8.0.17 及更高版本中,已对此进行了轻微优化。)

执行存储过程需要检索有关存储过程的信息(以对齐参数);它比直接执行 SQL 语句更“昂贵”。(您可以使用 禁用此功能CheckParameters=false,但我不建议这样做。)

如果您想要更高效的 .NET 客户端库,可以切换到MySqlConnector 。它已针对性能(在客户端 CPU 时间和网络 I/O 方面)进行了调整,并且在打开连接和执行查询时不会执行太多不必要的工作。(MySqlConnector 是用于TechEmpower Framework Benchmarks中 .NET/MySQL 基准测试的客户端库。)

于 2019-07-26T00:10:41.157 回答