Запустите запрос Firebird в фоновом потоке и сохраните набор результатов - PullRequest
3 голосов
/ 08 апреля 2011

Я хочу поместить выполнение запроса с параметрами в потокобезопасный класс в delphi-2009.

Я перехожу в Google, но я не нашел только то, что хотел.

Спасибо

1 Ответ

10 голосов
/ 08 апреля 2011

Я обнаружил, что большинство API баз данных являются поточно-ориентированными только на уровне соединения. Firebird может отличаться, но использование InterBase несколько (8+) лет назад не было поточно-ориентированным. Обновление: Я подтвердил, что Firebird безопасен только для потоков на уровне соединения.

Это означает, что обычно вам нужно избегать использования одного соединения из более чем одного потока одновременно. Выполнение запроса к данному соединению применяется. Избегайте использования двух запросов в разных потоках для одного и того же соединения.

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

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

Самый простой способ передачи данных - это создание, вы можете приостановить поток, установить различные свойства для вашего потомка TThread. Затем возобновите выполнение потока. Фактический код, выполняющий работу в потоке, должен вызываться из метода Execute().

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

В Delphi есть библиотечные оболочки для каждого из них в модуле SyncObjs.pas.

...