Многопоточное приложение базы данных Delphi не работает с большими объемами данных

Обзор приложения:
У меня есть приложение Delphi, которое позволяет пользователю определять количество запросов и запускать их одновременно в нескольких базах данных MySQL. Существует ограничение на количество потоков, которые можно запускать одновременно (которое может установить пользователь). Пользователь выбирает запросы для выполнения и системы для выполнения запросов. Каждый поток выполняет указанный запрос в указанной системе с помощью компонента TADOQuery.

Описание проблемы:
Когда запросы извлекают небольшое количество записей, приложение работает нормально, даже когда много потоков (примерно до 100) представлены. Приложение также может обрабатывать большее количество записей (150, 000+), если одновременно выполняется всего несколько потоков (до 8). Однако, когда пользователь выполняет более 10 запросов одновременно (то есть 10+ потоков), и каждый поток извлекает около 150 000+ записей, мы начинаем получать ошибки. Вот конкретные сообщения об ошибках, с которыми мы столкнулись до сих пор:

a: Недостаточно памяти для выполнения этой операции
b: Ошибка OLE 80040E05
c: Не указано ошибка
d: Ошибка создания потока: Недостаточно памяти для обработки этой команды
e: Объект был открыт
f: Драйвер ODBC не поддерживает запрошенные свойства

Очевидно, что ошибки происходят из-за комбинации факторов: количества потоков, количества данных, извлекаемых на поток, и, возможно, конфигурации сервера MySQL.

Главный вопрос действительно в том, почему возникают ошибки? Я понимаю, что это каким-то образом связано с ресурсами, но, учитывая различные возвращаемые ошибки, я хотел бы понять, почему именно они возникают. Это связано с ресурсами на ПК или, например, с конфигурацией сервера.

Следующий вопрос: что мы можем сделать, чтобы избежать проблем? В настоящее время мы ограничиваем работу приложения, уменьшая количество потоков, которые могут выполняться одновременно. Мы не можем заставить пользователя извлекать меньше записей, поскольку запросы полностью определяются пользователем, и если они хотят получить 200 000 записей, то это их дело, так что мы мало что можем сделать с этой стороной вещей. На самом деле мы не не хотим ограничивать скорость приложения, потому что большинство пользователей будут извлекать небольшие объемы данных, и мы не хотим, чтобы приложение замедляло их использование, и хотя количество потоков может быть изменено пользователем , мы предпочли бы добраться до корня проблемы и попытаться исправить ее, не полагаясь на постоянную настройку конфигурации.

8
задан Jeedee 1 March 2011 в 17:41
поделиться