У меня есть класс TcpListener
, и я использую async/await
чтение и запись.
Для этого сервера я создал отдельный экземпляр базы данных, где я подготовил все запросы к базе данных.
Но для более одного TcpClient
я получаю исключение:
Произошло исключение типа
MySql.Data.MySqlClient.MySqlException
вMySql.Data.dll
, но не был обработан в коде пользователяДополнительная информация: уже существует открытый
DataReader
с этимConnection
, который должен быть закрыт первым.
Если я правильно понимаю, не может быть более одного запроса базы данных во время, что является проблемой для более чем одного клиента async
.
Поэтому я просто добавил блокировки в своих запросах, как это, и все кажется прекрасным.
// One MySqlConnection instance for whole program.
lock (thisLock)
{
var cmd = connection.CreateCommand();
cmd.CommandText = "SELECT Count(*) FROM logins WHERE username = @user AND password = @pass";
cmd.Parameters.AddWithValue("@user", username);
cmd.Parameters.AddWithValue("@pass", password);
var count = int.Parse(cmd.ExecuteScalar().ToString());
return count > 0;
}
Я также пытаюсь использовать метод, который создает новое соединение для каждого запроса, как упоминается у кого-то из сообщества SO, но этот метод намного медленнее, чем блокировки:
using (MySqlConnection connection = new MySqlConnection(connectionString))
{
connection.Open(); // This takes +- 35ms and makes worse performance than locks
using (MySqlCommand cmd = connection.CreateCommand())
{
cmd.CommandText = "SELECT Count(*) FROM logins WHERE username = @user AND password = @pass";
cmd.Parameters.AddWithValue("@user", username);
cmd.Parameters.AddWithValue("@pass", password);
int count = int.Parse(cmd.ExecuteScalar().ToString());
return count > 0;
}
}
Я использовал секундомер для сравнения этих методов, и запросы с одним соединением с блокировками выполняются в + - 20 мс, который представляет собой + - только задержку сети, но с потреблением + 55 мс из-за метода .Open()
, который принимает + - 35 мс.
Почему многие люди используют метод с использованием, если есть гораздо худшая производительность? Или я делаю что-то неправильно?