Столкнулся с очень интересной ситуацией... У меня имеется рабочий проект на Delphi XE2 в котором я использую компоненты UniDAC версии 6.2.8 для доступа к БД MySQL. Для повышения отказоустойчивости БД поднял кластер на движке Percona XtraDB. На виртуалках ось UBUNTU 16. Причем, организовал через nginx проксирование запросов для распределения нагрузки. Но суть не в этом...
В проекте я использую множество датасетов, в том числе и которые создаю динамически. Если я создаю датасет, затем описываю запрос, вызываю метод Prepare и делаю Open, то.. Вы не поверите.. Кластер благополучно крашится. Сначала выпадает одна нода из кластера, после очередного запроса - вторая, и т.д. Пока весь кластер не отключится. В логах ничего нет. Просто процесс MySQL вылетает из памяти и все. Знаю, что это немного не по теме. Но дело в том, что это связано именно с вызовом метода Prepare. Без него всё работает.
Если сервер MySQL на Win системе, то все нормально. Такой проблемы нет.
Я не понимаю как метод Prepare может положить процесс MySQL. Как работает Prepare в UniDAC? Что он может делать такого? Исходников модуля Uni.pas у меня нет, чтобы покопаться в коде. Читал, что метод Prepare парсит запрос для корректного принятия параметров, т.е. он по сути на сервер ничего не отправляет, а отрабатывает на стороне клиента. Есть подробная информация об этом?
Привожу пример простого кода динамически созданного Query. Аналогично используются и статичные датасеты и проблема та же
Код: Выделить всё
Query_some:=TUniQuery.Create(self);
Query_some.Connection:=UniConnection1;
Query_some.SQL.Add('select * from some_tbl where id=:id');
Query_some.Prepare;
Query_some.ParamByName('id').AsString:=AIncident_Id;
Query_some.Open;
// ...
Query_some.Free;