Я создал серверное приложение TCPip. Приложение имеет один глобальный TADOConnection. Это глобальное соединение суматохи используется и для основных запросов потока и также в рамках потоковых процессов.
Это в порядке? ADOConnection имеет созданным в механизмах для обработки нескольких запросов одновременно?
Мои работы приложения находят в тестовых средах (2-5 соединений). Но развернутый в продуктивной среде я получаю "необъяснимые" нарушения прав доступа в точке, TADOQuery, связанные с ADOConnection, установлены на открытый.
Я должен использовать ADOConnection, или все запросы должны просто установить связь с базой данных самостоятельно (который является, вероятно, немного большим количеством дорогостоящего ресурса)?
У каждого потока должен быть свой собственный объект подключения. Следующая ссылка предоставляет дополнительную информацию: 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;