Соединения 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 позаботится об этом)?
Итак, вопрос: это безопасно делать или я делаю что-то не так?