MySqlConnection ADO.Net Высокая загрузка ЦП - PullRequest
0 голосов
/ 06 декабря 2018

У меня есть многопоточное приложение, где N потоков обращаются к базе данных MySQL.Каждый запрос создаст свой собственный MySqlConnection intance, чтобы избежать совместного использования MySqlDataReader .Однако мы сталкиваемся с пиками ЦП на наш сервер базы данных.Я уже пытался запустить SHOW PROCESSLIST , но в результатах нет медленных запросов.Я подозреваю, что основной причиной является то, как потоки обрабатывают соединения.

Ниже приведен пример моего метода запроса.

public List<Configuration> GetAlertConfigByDeviceID(string deviceID) 
{
    List<Configuration> configurations =  new List<Configuration>();
    try
    {
        using (MySqlConnection dbConnection = new MySqlConnection(WinAlerterConfig.WebConnectionString))
        {
            dbConnection.Open();
            using (MySqlCommand dbCommand = dbConnection.CreateCommand())
            {
                dbCommand.CommandText = StoredProcedures.SqlGetAlertCfgDetailByDeviceID;
                dbCommand.Parameters.Add(new MySqlParameter("DeviceID", deviceID));

                using (MySqlDataReader dbResultSet = dbCommand.ExecuteReader())
                {
                    if (dbResultSet.HasRows)
                    {
                        while (dbResultSet.Read())
                        {
                            configurations.Add(new Configuration()
                            {
                                ConfigID = dbResultSet.GetUInt64Safe(0),
                                AlertType = dbResultSet.GetUInt64Safe(1),
                                ZoneID = dbResultSet.GetUInt64Safe(2),
                                Timeout = dbResultSet.GetInt64Safe(3),
                                DeviceID = dbResultSet.GetStringSafe(4),
                                FromZoneID = dbResultSet.GetUInt64Safe(5),
                                OtherZoneAlert = dbResultSet.GetBooleanSafe(6),
                                Remarks = dbResultSet.GetStringSafe(7)
                            });
                        }
                    }
                    dbResultSet.Close();
                    dbResultSet.Dispose();
                }
                dbCommand.Dispose();
            }
            dbConnection.Close();
            dbConnection.Dispose();
        }
    }
    catch (MySqlException ex)
    {
        Logger.LogErrorLine("GetAlertConfigByDeviceID: {0} {1} {2}", ex.Message, Environment.NewLine, ex.StackTrace);
    }
    catch (Exception ex)
    {
        Logger.LogErrorLine("GetAlertConfigByDeviceID: {0} {1} {2}", ex.Message, Environment.NewLine, ex.StackTrace);
    }

    return configurations;
}

Я также включил "polling = true;" в нашей строке подключения.Поэтому я предполагаю, что MySQL или ADO.net будут обрабатывать пул соединений.

Что-то не так в моем методе?Пул соединений уже обработан ADO.net уже?

1 Ответ

0 голосов
/ 06 декабря 2018

Удаление всех ваших вызовов Close и Dispose.Блок использования уже заботится об утилизации.

Также убедитесь, что у вас есть индекс для столбца deviceId.

Затем повторите попытку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...