mysql - 多线程 Delphi 数据库应用程序因大量数据而失败

标签 mysql sql multithreading delphi

应用概述:
我有一个 Delphi 应用程序,允许用户定义多个查询,并在多个 MySQL 数据库上同时运行它们。一次可以运行的线程数有限制(用户可以设置)。用户选择要运行的查询,以及运行查询的系统。每个线程使用 TADOQuery 组件在指定系统上运行指定查询。

问题描述:
当查询检索到少量记录时,应用程序可以正常工作,即使提交了很多线程(最多约 100 个)也是如此。该应用程序还可以处理更多的记录(150,000+),只要同时运行几个线程(最多约 8 个)即可。然而,当用户一次运​​行超过 10 个查询(即 10+ 线程),并且每个线程检索大约 150,000+ 条记录时,我们开始出现错误。以下是我们目前遇到的具体错误消息:

a: 没有足够的存储空间来完成这个操作
b: OLE 错误 80040E05
c: 未指定的错误
d: 线程创建错误:没有足够的存储空间来处理这个命令
e: 对象已打开
f: ODBC 驱动程序不支持请求的属性

显然,错误是由多种因素共同造成的:线程数量、每个线程检索的数据量,以及可能的 MySQL 服务器配置。

真正的主要问题是为什么会出现错误?我很欣赏它似乎在某种程度上与资源相关,但考虑到返回的错误不同,我想弄清楚为什么会出现这些错误。是与 PC 上的资源有关,还是与服务器的配置有关,例如。

后续问题是我们可以做些什么来避免出现问题?我们目前正在通过减少可以并发运行的线程数来限制应用程序。我们不能强制用户检索更少的记录,因为查询完全是用户定义的,如果他们想要检索 200,000 条记录,那么这取决于他们,所以我们在这方面无能为力。实际上,我们不想降低应用程序的速度,因为大多数用户只会检索少量数据,我们不想让应用程序变慢以供他们使用,尽管线程数可以被用户更改,我们宁愿找到问题的根源并尝试修复它,而不必一直依赖调整配置。

最佳答案

看起来您正在加载大量客户端数据。它们可能需要缓存在客户端内存中(特别是如果您使用双向游标),并且在 32 位应用程序中这还不够,具体取决于平均行大小和库存储行的效率。 通常完成数据库工作的最好方法是直接在服务器上执行,而不是将数据检索到客户端。通常数据库有一个高效的缓存系统,当数据不适合内存时,可以将数据写出到磁盘。 为什么一次检索 150000 行?您可以使用一种机制仅在用户实际访问数据时才传输数据(通过数据进行分页),以避免大量“浪费”内存。

关于mysql - 多线程 Delphi 数据库应用程序因大量数据而失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5158211/

相关文章:

c - 想要避免一次调用八个线程的 sempost

php - 与 mysql 和路径交叉检查

sql - 将多个字段合并为一个

java - 如何优化缓慢的 Mysql SELECT 查询?

android - java.lang.RuntimeException : caused while executing doInBackground() in Xiaomi device only 错误

java - 为什么在下面的阻塞队列示例中调用notify()的顺序很重要?

mysql - Node js 使用连接池和多个参数调用mysql中的存储过程

javascript - ER_ACCESS_DENIED_ERROR CloudSQL

php - 如何在Laravel中的unionAll之后将group by添加到 Eloquent 查询中?

php - 从 php 中的 sql 资源中选择 MAX(value)