【问题标题】:MySQLCommand BeginExecuteReader is missing an AsyncCallback parameter rendering it virtually uselessMySQLCommand BeginExecuteReader 缺少 AsyncCallback 参数,使其几乎无用
【发布时间】:2009-09-18 14:22:31
【问题描述】:

我希望这里有人可以帮助我。

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

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

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

据我所知,如果代码没有引发回调,我需要进行轮询,这会使其变慢。我也想避免为每个连接使用阻塞线程。

有人知道如何解决这个问题吗? (除了更改可能超出我能力的驱动程序)

R

【问题讨论】:

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


    【解决方案1】:

    MySQL 连接器的 6.3.4 版本实现了异步方法,但它似乎只异步调用委托,因此它不会阻塞调用线程,但不会保存线程池中的任何线程。 Here's the bug report about this.

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

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

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

    【讨论】:

    • scheffer:这与数据库的异步连接无关,更多的是我的程序完全异步(使用 Microsoft 的 CCR)。任何停止(阻塞)的线程都会显着降低我的服务器的性能(因为我每个核心只使用 1 个线程)。
    • @Toad:很酷,如果你已经测量过了,那么请忽略我最后的评论。无论如何,我检查了 devart 的数据提供者,他们似乎也在使用“异步委托”技巧,所以他们也不会保存任何线程。
    【解决方案2】:

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

    【讨论】:

    • 我很想用异步数据模型。 Server2003 在很多方面都支持这一点(例如查询网页、查询数据库(至少使用 MSSQL)、套接字操作等)。这使得使用大量线程的需要消失,从而产生快速高效的代码。不幸的是 MySQL 似乎已经实现了异步操作的一半。或者看起来像
    【解决方案3】:

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

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

    尝试使用 Postgres。我没有使用过它(C API 让我望而却步——所有这些 typedef),但它确实对多线程查询(例如异步调用等)有适当的支持。

    【讨论】:

      猜你喜欢
      • 2014-09-08
      • 2019-11-24
      • 2010-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-23
      • 2020-10-13
      • 2016-11-30
      相关资源
      最近更新 更多