Хорошо использовать TADOConnection в потоках

Я создал серверное приложение TCPip. Приложение имеет один глобальный TADOConnection. Это глобальное соединение суматохи используется и для основных запросов потока и также в рамках потоковых процессов.

Это в порядке? ADOConnection имеет созданным в механизмах для обработки нескольких запросов одновременно?

Мои работы приложения находят в тестовых средах (2-5 соединений). Но развернутый в продуктивной среде я получаю "необъяснимые" нарушения прав доступа в точке, TADOQuery, связанные с ADOConnection, установлены на открытый.

Я должен использовать ADOConnection, или все запросы должны просто установить связь с базой данных самостоятельно (который является, вероятно, немного большим количеством дорогостоящего ресурса)?

6
задан Earlz 16 July 2010 в 15:42
поделиться

2 ответа

У каждого потока должен быть свой собственный объект подключения. Следующая ссылка предоставляет дополнительную информацию: http://delphi.about.com/od/kbthread/a/query_threading.htm

Некоторые ключевые моменты из статьи:

1] Должны быть вызваны CoInitialize и CoUninitialize вручную перед использованием любого из объектов dbGo. Отсутствие вызова CoInitialize приведет к исключению «CoInitialize не был вызван». Метод CoInitialize инициализирует библиотеку COM в текущем потоке. ADO - это COM.

2] Вы не можете использовать объект TADOConnection из основного потока (приложения). Каждому потоку необходимо создать собственное соединение с базой данных.

8
ответ дан 8 December 2019 в 15:58
поделиться

@M Schenkel, см. этот вопрос Является ли TADOConnection в Delphi потокобезопасным?. Каждому потоку нужно свое соединение, потому что ADO - это технология, основанная на COM, и она использует многопоточные объекты.

см. этот пример

procedure TMyThread.Execute;
begin
   CoInitialize(nil);
   try
     try
       // create a connection here
     except
     end;
   finally
     CoUnInitialize;
   end;
end;
7
ответ дан 8 December 2019 в 15:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: