2008-09-18 1 views
1

У меня есть приложение Win-CGI, которое я сейчас конвертирую в ISAPI.Безопасный для использования объект TAdsSettings в основном потоке и объекты AdsQuery в других потоках?

Приложение использует потомки TDataset для расширенного сервера баз данных Advantage.

Как может быть только один экземпляр объекта TAdsSettings, это должно быть в основном потоке.

В объектах запроса требуются объекты TAdsQuery.

Будет ли это работать - то есть будут ли AdsQueries в запросах нитью получить глобальные настройки из объекта AdsSettings в основном потоке , и будет ли это быть потокобезопасным?

ответ

1

Да, это сработает. Компонент TAdsSettings изменяет параметры в Advantage Client Engine (ACE), а с ISAPI будет загружен один экземпляр ACE, который использует все потоки.

Я бы не рекомендовал его, однако. В зависимости от настроек, которые вы меняете, было бы разумнее просто напрямую обращаться к API ACE. Например, если вы только устанавливаете формат даты, имеет смысл устранить компонент TAdsSettings и просто вызвать AdsSetDateFormat60, который принимает дескриптор соединения. Избавление от компонента TAdsSettings устраняет множество вызовов для установки глобальных настроек ACE. Многие из этих вызовов должны иметь объект синхронизации, чтобы отключить все соединения, пока глобальное изменение. Это будет иметь негативное влияние на производительность, особенно в многопоточном приложении, таком как веб-приложение. Вместо этого выполняйте вызовы, которые работают с указанным дескриптором соединения.

Вы можете получить дескриптор соединения, указав свойство TAdsConnection.Handle или вызвав метод TAdsQuery.GetAceConnectionHandle.

0

Убедитесь, что AdsQueries использовать синхронизацию, чтобы получить доступ к TAdsSettings непосредственно (или использовать систему обмена сообщениями общаются между рабочими потоками и главным потоком вместо доступа непосредственно), если они не находятся в главном потоке (т.е. System.MainThreadID <> Windows.GetCurrentThreadID)

+0

Согласен, в общем, синхронизация - это самый безопасный (синхронный) способ использования основного потока из дочерних потоков. (msgs лучший способ async) Однако я специально спрашиваю о ADS comps, а не об общей потоковой передаче. Джереми имеет более актуальную информацию о специфике ADS и их внутренней работе – Graza 2008-09-22 10:08:32

0

Я также задал этот вопрос в группе новостей: devzone.advantagedatabase.com, Advantage.Delphi

Для полноты картины я добавлю еще один вопрос/ответ от остальной части этой темы:

Вопрос (Me):

Многие из этих запросов в темах, в настоящее время не прикреплен к объекту TAdsConnection. Я планирую создать соединение для каждого потока для этих «сиротских» запросов, но это большое приложение , и это потребует времени. Я также уверен, что единственным объектом, отличным от значения по умолчанию в объекте TAdsSettings, является набор типов серверов, который может быть установлен в компоненте соединения , поэтому после того, как все запросы будут связаны с соединениями , компонент настроек не будет быть нужным. Я посмотрю на вызов API настроек непосредственно в качестве альтернативы.

В то же время у меня есть вопрос о потоковом и запросах без назначенного компонента соединения.Я отметил из файлов справки, что , если запросы в нескольких потоках совместно используют один объект соединения, запросы будут запускаться последовательно, а не одновременно. С объектом соединения в каждом потоке это не должно быть проблемой, но я интересуется запросами, которые имеют , а не имеют объект связи . Будут ли они считаться находящимися на независимых соединениях от точки зрения многопоточности параллелизма, или они будут считаются находящимися на одном и том же соединении и, следовательно, должны уступать каждому другим?

Ответ (Джереми):

Вам нужно будет решить эту проблему. Они просто будут искать глобальный список соединений , чтобы найти один с тем же путем, и они будут использовать это соединение. Не хорошо в многопоточном приложении.

Таким образом, из ответа Джереми лучше всего создать по крайней мере один объект TAdsConnection для каждого потока и обеспечить присоединение к нему всех запросов, иначе может произойти сериализация.

Смежные вопросы