c mysql 异步查询_C#Mysql – 使用锁在数据库上查询异步等待服务器

在C#中使用TcpListener处理多个异步TCP客户端时遇到MySQL连接异常。问题在于并发查询导致的已打开DataReader。通过在查询时添加锁解决了异常,但性能受到影响。对比使用新的MysqLConnection实例,发现带有锁的方法虽然避免异常,但执行速度更快。疑问在于为何社区推荐使用新的连接实例,尽管这会导致更长的执行时间。
摘要由CSDN通过智能技术生成

我有TcpListener类,我正在使用async / await阅读和写作.

对于这个服务器,我创建了单个数据库实例,我准备了所有的数据库查询.

但是对于更多的TcpClient,我会不断得到异常:

An exception of type MySql.Data.MySqlClient.MysqLException occurred

in MysqL.Data.dll but was not handled in user code

Additional information: There is already an open DataReader associated

with this Connection which must be closed first.

如果我理解正确,则不能再有一个数据库查询在时间上是多个异步客户端的问题.

所以我只是在这样的查询中添加了锁,一切似乎都很好.

// 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;

}

}

我使用秒表来测试这种方法和查询,一个连接与锁是在 – 20ms执行,这是 – 只有网络的延迟,但使用它是 – 55ms,因为.Open()方法 – 35ms.

为什么很多人使用使用方法,如果性能更差?还是我做错了?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值