Соединения mySQL не закрываются при наведении

При использовании следующего кода:

for (int C = 0; C < 200; C++) {
    Task<OdbcDataReader> TDR = Task.Run(() => {
        OdbcConnection Conn = new OdbcConnection("DSN=FDB");
        Conn.Open();

        using (OdbcCommand Cmd = new OdbcCommand(SQL, Conn)) {
            return Cmd.ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection);
        }
    });     // Start DB query

    // Do other stuff

    using (OdbcDataReader DR = await TDR) while (DR.Read()) ;    // Wait for data and process
}

OdbcDataReader не закрывает соединение, и я получаю "слишком много соединений" от mySQL (с 100+, показанными в "show processlist") - даже если у меня включен пул соединений.

Если я запускаю синхронно - идентичный код, но без переноса части запроса в Task.Run(), я получаю одно соединение, которое многократно используется снова и снова, поэтому кажется, что многопоточность вызывает проблему.

После долгих проб и ошибок я обнаружил, что могу обойти эту проблему, удалив "using (OdbcDataCommand...") и просто создав OdbcDataCommand, который никогда не удаляется. С этим изменением:

//using (OdbcCommand Cmd = new OdbcCommand(SQL, Conn)) {
return new OdbcCommand(SQL, Conn).ExecuteReader(CommandBehavior.SingleResult | CommandBehavior.CloseConnection);
//}

он создает только одно соединение, как и ожидалось, и все идет гладко

Я провел тест с несколькими тысячами итераций и не обнаружил утечку памяти - нужно ли утилизировать OdbcCommand (возможно, CommandBehaviour.CloseConnection позаботится об этом)?

Итак, вопрос: это безопасно делать или я делаю что-то не так?

0 ответов

Другие вопросы по тегам