Потоки запросов DbExpress - PullRequest
       11

Потоки запросов DbExpress

3 голосов
/ 03 февраля 2009

Я только сделал доступ к базе данных «GUI» в Delphi с компонентами DbExpress, но теперь я хотел бы выполнить один запрос на фоне. Я читал, где это TSQLConnection не является потокобезопасным, и я должен создать новое соединение для каждого потока. Я вижу, что в TSQLConnection есть CloneConnection, но справка утверждает, что новые соединения принадлежат исходному соединению.

Итак,

1) Как правильно выполнить TSQLQuery, расположенный в потоке модуля данных?

2) Могу ли я использовать TSQLConnection.CloneConnection? Должен ли я освободить клонированные соединения или оставить их нетронутыми после окончания потока?

Простой пример кода (или URL) был бы очень полезен.

1 Ответ

4 голосов
/ 03 февраля 2009

Это не относится к DbExpress (с которым у меня нет опыта), но лучшая идея для переноса некоторой функциональности в фоновый поток - сначала разработать ее в основном потоке, отладить ее, и как только вы убедитесь, что это так. хорошо, затем переместите его.

Что вы можете сделать, это поместить все в TDataModule. Если модуль данных может работать сам по себе, не требуя других компонентов в других формах или модулях данных, и вы создаете его в фоновом потоке, то вы можете быть совершенно уверены, что все будет работать. Вам не нужно клонировать соединение, так как оно будет создано и уничтожено в том же потоке, где осуществляется весь доступ к базе данных.

Несколько важных советов по работе с базами данных с фоновыми потоками:

  • Обрабатывайте все исключения, поскольку необработанные исключения во вторичном потоке могут привести к сбою вашего приложения. Обработка исключений в объекте Application не будет работать для вас.

  • Не получить доступ к чему-либо в потоке GUI. Это означает, что наиболее важно, что TDataSource не может использоваться и никакие чувствительные к данным элементы управления не могут быть использованы.

  • Если используемые вами компоненты что-либо делают с SendMessage или PostMessage, вам придется создать стандартный цикл сообщений в фоновом потоке.

  • Если используемые вами компоненты что-то делают с OLE, вызовите OleInitialize () и OleUnitialize () в контексте фонового потока.

Если вы хотите облегчить свою жизнь, рассмотрите возможность использования OmniThreadLibrary или AsyncCalls . Какой из них зависит от того, как долго будут работать ваши фоновые соединения с базой данных и хотите ли вы использовать их повторно.

...