Как использовать FireDac TFDQuery во время разработки Delphi при использовании нескольких потоков?

Я хочу спроектировать свой TFDQuery с помощью редактора компонентов, т.е. установить строку SQL, параметры и т. д. во время разработки, а затем использовать запрос в потоке.

Моя проблема в том, что каждому работающему экземпляру потока нужен свой собственный экземпляр запроса, иначе он не будет потокобезопасным.

Должен ли я клонировать запрос при запуске потока, т.е. в методе Execute потока, а затем устанавливать его соединение - если да, то как? Или есть лучший способ сделать это?

Благодарю вас


person Floris    schedule 11.01.2016    source источник


Ответы (1)


Как описано в документации:

...после того, как поток открывает запрос и пока его обработка не будет завершена, приложение не может использовать этот запрос и объекты соединения в другом потоке. Точно так же после того, как поток запустил транзакцию и пока транзакция не завершена, приложение не может использовать эту транзакцию и объекты соединения в другом потоке.

А также:

Стандартное упрощение заключается в создании и использовании для каждого потока выделенного объекта соединения, работающего с базой данных.

Таким образом, самое простое решение - иметь отдельное соединение для каждого рабочего потока. Если вы используете компоненты FireDAC (соединение, транзакция и запрос) в одном и том же модуле данных, то самым простым решением для вас может быть простое создание отдельного экземпляра всего модуля данных для каждого из ваших рабочих потоков.

person Ondrej Kelle    schedule 11.01.2016
comment
Спасибо за ваш ответ! Модуль данных имеет около 5 запросов и будет вызываться в среднем около 5 раз в секунду в часы пик. Меня немного беспокоило время, необходимое для создания модуля данных каждый раз. Сделаю несколько тестов и отчитаюсь здесь. - person Floris; 11.01.2016
comment
Добро пожаловать. Вместо того, чтобы создавать и уничтожать модуль данных для каждого запроса, вы можете рассмотреть возможность использования пула соединений для сохранения соединений, чтобы их можно было использовать повторно. - person Ondrej Kelle; 11.01.2016
comment
Да. Моя идея состояла в том, чтобы использовать пул соединений, предоставляемый FireDac, но ваше предложение, вероятно, является лишь дополнительной работой, и я все еще могу использовать с ним пул соединений FireDac. - person Floris; 11.01.2016
comment
Из связанной документации кажется, что единственное, что вам нужно сделать для автоматического объединения пулов соединений, это установить для параметра Pooled соединения значение True. В каталоге Samples есть демо под названием Pooling, которое демонстрирует это. - person Ondrej Kelle; 11.01.2016
comment
Еще раз спасибо TOAndrej. Я использовал пул соединений - он работает на 100%. Также протестировано создание модуля данных и его освобождение каждый раз при создании потока, т.е. нет «пула модулей данных», и в цикле выполнения этого 100 раз требуется около 10 мс для каждого создания и освобождения на моем медленном ноутбуке, поэтому буду придерживаться что. - person Floris; 11.01.2016