Хорошо, чтобы использовать 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;