I have TcpListener
类和我正在使用async/await
读写。
对于该服务器,我创建了单个数据库实例,在其中准备了所有数据库查询。
但对于不止一个TcpClient
我不断遇到异常:
类型异常MySql.Data.MySqlClient.MySqlException
发生
在MySql.Data.dll
但未在用户代码中处理
附加信息:已经有一个开放的DataReader
联系
有了这个Connection
必须先关闭它。
如果我理解正确的话,一次不能有一个以上的数据库查询,这是一个以上的问题async
client.
所以我只是像这样在查询中添加了锁,一切看起来都很好。
// 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;
}
我还尝试了使用 usings 的方法,该方法为每个查询创建新的连接,正如 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;
}
}
我使用 Stopwatch 来对这种方法进行基准测试,并且带有锁的一个连接的查询在 +- 20 毫秒内执行,这只是网络的延迟,但使用时它是 +- 55 毫秒,因为.Open()
方法需要+/- 35ms。
如果性能更差,为什么很多人使用方法和使用?或者我做错了什么?