Хорошо, чтобы использовать TADOConnection в потоках - PullRequest
6 голосов
/ 16 июля 2010

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

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

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

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

Ответы [ 2 ]

8 голосов
/ 16 июля 2010

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

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

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

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

7 голосов
/ 16 июля 2010

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

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

procedure TMyThread.Execute;
begin
   CoInitialize(nil);
   try
     try
       // create a connection here
     except
     end;
   finally
     CoUnInitialize;
   end;
end;
...