从 Delphi 异步访问 MySQL 数据库

Posted

技术标签:

【中文标题】从 Delphi 异步访问 MySQL 数据库【英文标题】:Accessing MySQL database from Delphi asynchronously 【发布时间】:2013-08-15 12:27:36 【问题描述】:

如何?

执行 select 语句的线程不应被阻塞。为每个活动的 select 语句创建后台线程也不是一个解决方案,因为在负载较重的系统上,这会创建许多线程并导致性能问题。

IOCP(i/o 完成端口)正是我所需要的。但我不知道如何将这项技术与 Delphi 的 mysql 一起使用。

【问题讨论】:

为什么您认为 IOCP 是适合您的方法。您认为并发执行数百个查询适合您的服务器吗?是的,客户端会很高兴,因为他们没有运行数百个线程,但是如果有很多客户端同时运行有这么多请求,那么服务器呢?考虑使用线程池并为查询设置队列。 重负载 = 性能问题?经典解决方案:增加更多性能:) @TLama,我想从我的硬件中提取最大可能的性能。想象一下情况,当我有一个 Web 服务器和多个数据库服务器连接到本地网络时。如果有数百个线程在我的 Web 服务器上运行,那么大量的 CPU 时间将用于在它们之间进行切换。但是为什么在没有必要的时候必须完成这项工作呢? Web 服务器应该提供网页,但不能在线程之间切换。我想实现 node.js 的功能,但是在 Delphi 上。 【参考方案1】:

如果您有某种应用程序,其中异步执行查询实际上是有意义的,那么就去做吧。让服务器处理并发问题。您可以轻松配置服务器。

例如,看看innodb_thread_concurrencymax_connections

【讨论】:

您没有回答如何从 Delphi 异步执行查询而不阻塞启动查询的线程并且没有为此创建单独的线程。请看我在问题下的评论。 @user1439838,您似乎在问您建议使用哪种方法。我选择“为每个活动的 select 语句创建后台线程”。 我想获得与 node.js 相同的性能,但在 Delphi 应用程序中。大量并发连接不是问题,但大量空闲线程等待某个事件 - 才是问题所在。

以上是关于从 Delphi 异步访问 MySQL 数据库的主要内容,如果未能解决你的问题,请参考以下文章

Delphi:使用元数据从 MySQL 返回数据库名称

Vert.x 异步访问数据库 MySQL

delphi uniDac

delphi 怎么执行mysql命令

同步与异步数据库访问

专职DBA-MySQL主从延迟复制