MySql.NET连接器在重载C#netcore异步进程中的使用

MySql.NET连接器在重载C#netcore异步进程中的使用,c#,.net-core,async-await,mysql-connector,C#,.net Core,Async Await,Mysql Connector,MySql.NET连接器在重载异步进程中的使用 我正在从头重写一个C#.NET核心多线程tcp服务器(用于IoT项目),该服务器跨多个节点提供服务,每个节点的tcp客户端连接数>5k,并迁移到异步版本(我希望每个节点使用异步模式至少获得10k个连接,而不会对cpu造成明显的负载) 每个连接都需要定期从MySQL数据库读/写(空闲时至少每3分钟写一次,有活动时更是如此) 到目前为止,我一直在使用.NET连接器连接池功能,我声明了一个[ThreadStatic]静态连接对象,它确保每个线程都有一个不

MySql.NET连接器在重载异步进程中的使用

我正在从头重写一个C#.NET核心多线程tcp服务器(用于IoT项目),该服务器跨多个节点提供服务,每个节点的tcp客户端连接数>5k,并迁移到异步版本(我希望每个节点使用异步模式至少获得10k个连接,而不会对cpu造成明显的负载)

每个连接都需要定期从MySQL数据库读/写(空闲时至少每3分钟写一次,有活动时更是如此)

到目前为止,我一直在使用.NET连接器连接池功能,我声明了一个
[ThreadStatic]
静态连接对象,它确保每个线程都有一个不同的线程安全连接

我从连接器的池中获取连接并将其放入线程静态连接实例中,然后尽快释放它

通过使用额外的自旋计数机制,如果需要在嵌套函数调用中运行多个sql语句,我可以避免获取/释放实例

不幸的是,除了多线程方法明显不太好的性能(至少可以说)之外,这种方法往往会在池中保留越来越多的打开和空闲连接

对于单个节点上的5k tcp连接,该节点上的sql查询每秒执行率约为50 q/s,这本身不是一个很大的值,但使池中的所有连接保持“活动”,从而防止连接器池管理器在其后台线程中实际释放空闲连接(每个节点约1000个连接)

现在才是真正的问题

我不清楚如何在异步环境中处理这种情况。 我也一直在使用另一种MySqlConnector,它声称是真正异步的,但我仍然有疑问

如果切换到异步/等待模式,我应该如何替换
[ThreadStatic]
实例

如何确保每个异步上下文流以线程安全的方式使用自己的连接实例(特别是考虑到在关闭所有游标之前,没有其他语句可以在连接上运行)

如何在需要时运行并行查询

如何处理连接器池管理器

我真的很困惑


我已经读过关于
asynchlocal
类的内容,但我对它了解不多。这是正确的路径吗?

从头开始创建一个健壮的可伸缩TCP客户端服务器不是一项简单的任务。另外,对于新手来说,正确使用异步和等待模式可能非常容易出错,另外,编写一个高效的数据访问层也可能是不可原谅的。问题是,您没有显示任何代码,因此我们无法判断您出了什么问题。所以这个问题变得太宽泛了。。我担心即使你展示了你的代码,也会有太多的内容。也许你需要把你的问题分解成更小的部分,缩小范围,并提出更小更全面的问题,而不是你只是在向数据库写入数据,还是也在执行选择?@一般来说,我的问题不是如何编写一个可伸缩的异步TCP服务器(这是我必须在别处解决的问题). 问题主要是如何在异步/等待环境中执行并发数据库访问。我所有的测试都以序列化访问结束,这是我没有预料到的。@Namoshek不幸地选择和插入/updates@AlbertoPastore我对这种规模和类型的应用程序没有太多的经验,但也许一个用于数据库操作的线程安全队列和一个访问数据库的集中式线程(-pool)可以帮助您。队列可以包含某种类型的查询对象,在选择时(或者在需要时在更新/插入时)可以使用回调。但不确定这会有多可行。