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

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

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

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

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

2 ответа

Решение

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

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

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

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

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

увидеть этот образец

procedure TMyThread.Execute;
begin
   CoInitialize(nil);
   try
     try
       // create a connection here
     except
     end;
   finally
     CoUnInitialize;
   end;
end;
Другие вопросы по тегам