Tôi có TcpListener
lớp và tôi đang sử dụng async/await
đọc và viết.C# Mysql - Sử dụng khóa trên truy vấn cơ sở dữ liệu cho máy chủ async chờ đợi
Đối với máy chủ này, tôi đã tạo một cá thể cơ sở dữ liệu duy nhất mà tôi đã chuẩn bị tất cả các truy vấn cơ sở dữ liệu.
Nhưng sau đó cho thêm một TcpClient
Tôi muốn nhận những ngoại lệ:
Một ngoại lệ của loại
MySql.Data.MySqlClient.MySqlException
xảy ra trongMySql.Data.dll
nhưng không được xử lý theo mã người dùngThông tin thêm: Hiện đã một là mở
DataReader
liên kết với số nàyConnection
phải được đóng trước tiên.
Nếu tôi hiểu chính xác thì không thể có nhiều hơn một truy vấn cơ sở dữ liệu vào thời điểm đó là vấn đề với nhiều khách hàng async
.
Vì vậy, tôi chỉ cần thêm khóa trong truy vấn của tôi như thế này và mọi thứ có vẻ ổn.
// 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;
}
Tôi cũng đã thử phương pháp này với usings mà tạo kết nối mới cho mỗi truy vấn như đã đề cập từ một người nào đó của SO cộng đồng nhưng phương pháp này là nhiều hơn nữa chậm hơn so với ổ khóa:
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;
}
}
tôi đã sử dụng Đồng hồ bấm giờ để điểm chuẩn này phương pháp và truy vấn với một kết nối với ổ khóa được thực hiện trong + - 20ms đó là + - chỉ chậm trễ của mạng nhưng với việc sử dụng nó là + - 55ms vì phương pháp .Open()
mất + - 35ms.
Tại sao nhiều người sử dụng phương pháp với việc sử dụng nếu có hiệu suất kém hơn nhiều? Hay tôi đang làm gì sai?
Bạn đã [bật MARS] (https://www.connectionstrings.com/sqlconnection/enable-mars/) và đặt [xử lý không đồng bộ] (https://www.connectionstrings.com/sqlconnection/asynchronous-processing/) trên chuỗi kết nối của bạn? –
@Paulo Morgado Tôi có MySQL không phải SQL. MySQL không có MARS như tôi tìm thấy trên google. –
Thay vì khóa tại sao không mở kết nối khác? – JSteward