Я использую DBExpress в Delphi 2007 для подключения к серверу базы данных MySQL5 в сети.Delphi - TSQLQuery, оставляющий возможность для MySQL даже после освобождения
Все работает нормально, пока я не попытаюсь загрузить большое количество данных. Я пытаюсь вставить 8000+ записей в базу данных, по одному в цикле, в цикле я передаю объект TSQLConection функции вместе с данными, которые нужно вставить.
Функция создает объект TSQLQuery и запускает запрос вставки, прежде чем освобождать TSQLQuery. когда я запускаю его на больших наборах данных, я получаю сообщения о том, что сервер MySQL имеет множество соединений. Я вижу это в списке процессов для сервера MySQL.
+---------+------+-------------------------------+--------+---------+------+--------+-----------------------+
| Id | User | Host | db | Command | Time | State | Info |
+---------+------+-------------------------------+--------+---------+------+--------+-----------------------+
| 2962500 | name | myispdomain.co.uk:27812 | data | Sleep | 3 | | [NULL] |
+---------+------+-------------------------------+--------+---------+------+--------+-----------------------+
Существует один entriy для каждого объекта TSQLQuery я создал, и если я пошагово код, который я могу увидеть новый один идти, когда я бегу ExecSQL(). Я вызываю FreeAndNil в TSQLQuery и пытаюсь позвонить Close перед его освобождением.
Мои настройки соединения MySQL являются
ConnectionName := 'MySQLConnection';
DriverName := 'MySQL';
GetDriverFunc := 'getSQLDriverMYSQL';
KeepConnection := TRUE;
LibraryName := 'dbxmys30.dll';
LoadParamsOnConnect := False ;
LoginPrompt := FALSE;
Name := 'mySQLConnection';
VendorLib := 'LIBMYSQL.DLL';
TableScope := [tsTable,tsView];
Params.Add('DriverName=MySQL');
Params.Add('HostName=www.sample.com');
Params.Add('Database=data');
Params.Add('User_Name=myuser');
Params.Add('Password=mypassword');
Params.Add('BlobSize=-1');
Params.Add('ErrorResourceFile=');
Params.Add('LocaleCode=0000');
Params.Add('Compressed=False');
Params.Add('Encrypted=True');
Если установить KeepConnection Ложь проблема уходит, но время для запуска запросов идет вверх.
Есть ли способ обойти это?
Вы пробовали обернуть ваши вставки в транзакцию? который должен требовать только одного соединения и должен исправить ваши проблемы с скоростью. -don –
Это ничего не меняет. Если используется несколько подключений, обертка транзакции не помогает; это просто означает, что теперь у вас активна транзакция для каждого из этих нескольких подключений. –
@ Re0sless вам удалось решить проблему? Если да, то как? У меня такая же проблема. –