MySQLCommand BeginExecuteReader缺少一个AsyncCallback参数,使其几乎无用

时间:2009-09-18 14:22:31

标签: .net mysql database ado.net database-connection

我希望有人可以帮助我。

我工作的公司宁愿使用MySQL而不是MSSQL。 所以我下载了最新的驱动程序(6.1)并移植了数据库层。

但是我找不到将回调作为参数的BeginExecuteReader函数。

这是有原因的吗?或者它与MySQL的工作方式不同?

据我所知,如果代码没有引发回调,我需要轮询哪个使得它变慢。每个连接使用一个阻塞线程也是我想要避免的。

任何想法如何解决这个问题? (除了改变可能超出我的权力的司机)

[R

3 个答案:

答案 0 :(得分:1)

MySQL Connector的6.3.4版本实现了异步方法,但它似乎只是异步调用一个委托,因此它对调用线程没有阻塞,但它不会保存ThreadPool中的任何线程。 Here's the bug report about this

而且,就像你说的那样,它没有回调参数。 Here's the bug report about this

我相信devart's data providers正确实施异步方法,但它们不是免费的。

无论如何,异步数据库调用本身并不意味着更好的整体可伸缩性。我建议您阅读文章“Should my database calls be Asynchronous?”进行深入分析。

答案 1 :(得分:0)

我不知道具体的连接器,但我见过的mysql的其他连接器只是等待服务器在execute()或query()调用期间返回数据。你得到的最接近的是使用“unbuffered”版本,它会立即从execute()或query()返回,但是当你尝试请求下一行但尚未从mysql服务器到达时会阻塞。

答案 2 :(得分:0)

MySQL线程支持在我看来基本上是事后的想法。

例如,您不能通过C API取消已发出的查询;相反,查询函数只是阻塞。要进行多个并发查询,每个查询需要一个线程!

尝试使用Postgres。我没有使用它(C API让我失望 - 所有那些typedef),但它肯定对多线程查询(例如异步调用等)有适当的支持。