У меня есть несколько процессов, вставляющих данные в ту же таблицу в моей базе данных. Я использую одно соединение с базой данных для всех процессов. Когда я пытался запустить один из sqlcommand, я получил вышеупомянутое исключение. Я провел некоторое исследование в Интернете, и кажется, что сервер Mysql поддерживает только один datareader для каждого соединения. И поскольку каждый процесс использует executeNonQuery для быстрого выполнения команд SQL, возможно, что предыдущий datareader не был закрыт при выдаче новых команд.
Есть ли способ решить эту проблему?
Спасибо
Основной причиной вашей ошибки является то, что (надеясь избежать очевидного), используется то же соединение и уже открыто/выполняется. Являются ли они static
на данный момент? Предложите посмотреть, почему объединение не используется или ограничено.
Считайте рефакторинг кода, чтобы иметь using
. Pseudo, noncompiling example:
private void ExecNonQuery(string sqlStatement)
{
using (var conn = new MySqlConnection(connString))
{
using (var cmd = new MySqlDataCommand(conn))
{
cmd.ExecuteNonQuery(sqlStatement);
}
}
}
или
private List<Customer> GetCustomers( )
{
string sqlStatement = "SELECT ID, Name FROM Customer";
using (var conn = new MySqlConnection(connString))
{
using (var cmd = new MySqlDataCommand(conn))
{
//get a reader and do something
using (var reader = new MySqlDataReader(sqlStatement))
{
...
}
}
}
}
Завершая создание этих объектов в операторе using
, вы убедитесь, что ваши объекты закрыты и удалены надлежащим образом.
Я бы предположил, что да, вы должны открывать новое соединение каждый раз. ADO.NET Драйвер для MySQL должен использовать правильный пул соединений. Вы действительно не должны думать об этом.
Почему несколько процессов используют одно и то же соединение? Что там нужно?