Jee*_*dee 8 mysql sql delphi multithreading
应用程序概述:
我有一个Delphi应用程序,允许用户定义大量查询,并在多个MySQL数据库上同时运行它们.可以一次运行的线程数量有限制(用户可以设置).用户选择要运行的查询以及运行查询的系统.每个线程使用TADOQuery组件在指定的系统上运行指定的查询.
问题描述:
当查询检索到少量记录时,即使提交了大量线程(最多约100个),应用程序也能正常工作.只要一次只运行几个线程(最多约8个),应用程序也可以处理大量记录(150,000+).但是,当用户一次运行超过10个查询(即10个以上的线程),并且每个线程正在检索大约150,000条记录时,我们就会开始出错.以下是我们目前遇到的具体错误消息:
a:Not enough storage is available to complete this operation
b:OLE error 80040E05
c:Unspecified error
d:线程创建错误:Not enough storage is available to process this command
e:Object was open
f:ODBC Driver does not support the requested properties
显然,错误是由多种因素共同造成的:线程数,每个线程检索的数据量以及可能的MySQL服务器配置.
主要问题是为什么会出现错误?我很欣赏它似乎在某种程度上与资源有关,但考虑到返回的错误不同,我想了解错误出现的原因.例如,它是由PC上的资源决定的,还是与服务器的配置有关.
后续问题是我们可以做些什么来避免出现问题?我们目前通过降低可以并发运行的线程数来限制应用程序.我们无法强制用户检索较少的记录,因为查询完全是用户定义的,如果他们想要检索200,000条记录,那么这取决于它们,因此我们无法做很多事情.实际上,我们不想降低应用程序的速度,因为大多数用户将检索少量数据,并且我们不希望使应用程序变慢以供他们使用,尽管线程数量可以由用户改变,我们宁愿找到问题的根源并尝试修复它,而不必依赖于一直调整配置.
小智 5
看起来你在客户端加载了很多数据.它们可能需要缓存在客户端内存中(特别是如果使用双向游标),并且在32位应用程序中可能不够,具体取决于平均行大小以及库存储行的效率.通常,完成数据库工作的最佳方法是直接在服务器上执行该操作,而无需将数据检索到客户端.通常,数据库具有高效的缓存系统,并且当数据不适合内存时可以将数据写入磁盘.为什么一次检索150000行?您可以使用一种机制仅在用户实际访问数据时传输数据(通过数据进行分页),以避免大量"浪费"的内存.
归档时间: |
|
查看次数: |
2220 次 |
最近记录: |