【发布时间】:2011-07-06 16:54:44
【问题描述】:
应用概述:
我有一个 Delphi 应用程序,它允许用户定义多个查询,并在多个 MySQL 数据库上同时运行它们。一次可以运行的线程数有限制(用户可以设置)。用户选择要运行的查询,以及要在其上运行查询的系统。每个线程使用 TADOQuery 组件在指定系统上运行指定查询。
问题描述:
当查询检索到少量记录时,应用程序工作正常,即使提交了大量线程(最多约 100 个)。只要一次只运行几个线程(最多约 8 个),该应用程序还可以处理大量记录(150,000+)。但是,当用户一次运行大约 10 个以上的查询(即 10+ 个线程),并且每个线程正在检索大约 150,000+ 条记录时,我们开始出现错误。以下是我们目前遇到的具体错误信息:
一个:Not enough storage is available to complete this operation
乙:OLE error 80040E05
c:Unspecified error
d:线程创建错误:Not enough storage is available to process this command
邮箱:Object was open
女:ODBC Driver does not support the requested properties
显然,错误是由多种因素造成的:线程数、每个线程检索的数据量,以及可能的 MySQL 服务器配置。
真正的主要问题是为什么会发生错误?我很欣赏它似乎在某种程度上与资源相关,但鉴于返回的错误不同,我想弄清楚错误出现的确切原因。是PC上的资源问题,还是与服务器的配置有关。
接下来的问题是我们可以做些什么来避免出现问题?我们目前正在通过减少可以并发运行的线程数来限制应用程序。我们不能强迫用户检索更少的记录,因为查询完全是用户定义的,如果他们想要检索 200,000 条记录,那么这取决于他们,所以我们在这方面无能为力。实际上,我们不想降低应用程序的速度,因为大多数用户将检索少量数据,我们不想让应用程序变慢以供他们使用,尽管线程数可以由用户更改,我们宁愿找到问题的根源并尝试修复它,而不必一直依赖于调整配置。
【问题讨论】:
-
你可以设置
TADOQuery.CursorType := ctOpenForwardOnly吗?它可能有助于资源分配。 -
你能告诉我们用于设置线程、连接和查询的代码吗?
标签: mysql sql multithreading delphi