Безопасно ли использовать объект TAdsSettings в основном потоке и объекты AdsQuery в других потоках?

StackOverflow https://stackoverflow.com/questions/92848

Вопрос

У меня есть приложение Win-CGI, которое я сейчас конвертирую в ISAPI.

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

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

Объекты TAdsQuery необходимы в потоках запросов.

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

Это было полезно?

Решение

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

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

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

Другие советы

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

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

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

Вопрос (Я):

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top