我有TcpListener
類,我正在使用async/await
讀寫。C#Mysql的使用鎖定數據庫查詢異步等待服務器
對於此服務器,我創建了單個數據庫實例,我準備了所有數據庫查詢。
但對於更多然後一個TcpClient
,我不斷收到異常:
MySql.Data.MySqlClient.MySqlException
類型的異常在MySql.Data.dll
發生 但在用戶代碼中沒有處理其他信息:已經有一個打開
DataReader
關聯 與此Connection
必須首先關閉。
如果我的理解正確,那麼不能再有一個數據庫查詢在多於一個客戶端出現問題。
所以我只是在我這樣的查詢中添加了鎖,一切似乎都很好。
// 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社區有人提及,但這種方法比鎖更慢,其創建的每個查詢新的連接usings:
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;
}
}
我用秒錶來這個方法的基準測試以及帶鎖的連接查詢是在+ - 20ms內執行的,這是+ - 只有網絡延遲,但是使用它是+ - 55ms,因爲.Open()
方法需要+ - 35ms。
爲什麼很多人使用使用方法,如果性能差得多?或者我做錯了什麼?
你有沒有[啓用MARS](https://www.connectionstrings.com/sqlconnection/enable-mars/)並設置[異步處理](https://www.connectionstrings.com/sqlconnection/asynchronous-processing/ )在你的連接字符串? –
@Paulo Morgado我有MySQL而不是SQL。 MySQL沒有像我在谷歌上發現的MARS。 –
而不是鎖爲什麼不打開另一個連接? – JSteward