Seguro para usar TAdsSettings objeto no thread principal, e AdsQuery objetos em outros segmentos?

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

Pergunta

Eu tenho um aplicativo Win-CGI Atualmente, estou convertendo para ISAPI.

O aplicativo usa os descendentes TDataset para Extended Systems Advantage Database Server.

Como pode haver apenas uma instância de um objeto TAdsSettings, este deve ser no segmento principal.

objetos TAdsQuery são necessários nos tópicos de solicitação.

Será que este trabalho - isto é, será que as AdsQueries nos tópicos de solicitação pegar as configurações globais dos AdsSettings objeto no principal fio, e será esta discussão ser seguro?

Foi útil?

Solução

Sim, ele vai trabalhar. Os TAdsSettings componentes configurações modifica no Advantage Client Engine (ACE), e com ISAPI haverá uma instância do ACE carregado que os tópicos usar.

Eu não recomendo, no entanto. Dependendo das definições que estão mudando faria mais sentido para apenas chamar as APIs ECA diretamente. Por exemplo, se você está definindo apenas o formato de data, que faz mais sentido para eliminar componente as TAdsSettings e apenas chamar AdsSetDateFormat60, que leva um identificador de conexão. Livrar-se dos TAdsSettings componentes Elimina muitas chamadas para configurações globais conjunto ECA. Muitas dessas chamadas têm de ter um objeto de sincronização para manter todas as ligações fora enquanto o mundial é alterado. Isso terá um impacto negativo no desempenho, especialmente em uma aplicação multi-threaded como um aplicativo web. Em vez disso fazer chamadas que operam no identificador de conexão especificado.

Você pode obter o identificador de conexão, fazendo referência a propriedade TAdsConnection.Handle ou chamar o método TAdsQuery.GetAceConnectionHandle.

Outras dicas

Certifique-se os AdsQueries usar Sincronizar para acesso as TAdsSettings diretamente (ou usar um sistema de mensagens de comunicar entre segmentos de trabalho e thread principal em vez de acessar diretamente) se eles não estão no thread principal (ou seja System.MainThreadID <> Windows.GetCurrentThreadID)

Eu também tinha essa pergunta no newsgroup: devzone.advantagedatabase.com, Advantage.Delphi

Por uma questão de exaustividade, vou acrescentar mais uma pergunta / resposta do resto do fio:

Pergunta (Me):

Muitas das consultas em tópicos não estão actualmente ligados a uma objeto TAdsConnection. Estou a planear criar uma conexão para cada thread para essas consultas "órfãos" de usar, mas é uma aplicação em larga e isso vai levar tempo. Eu também tenho certeza que o único não-padrão propriedade no objeto TAdsSettings é o conjunto de servidores-tipos, o que pode também ser definido no componente de conexão, assim, uma vez que todas as consultas são ligada às conexões, costuma ser necessário o componente configurações. eu vou procurar para chamar a API definições directamente como uma alternativa.

Enquanto isso, eu tenho uma pergunta sobre threading e as consultas sem componente de conexão atribuído. Notei a partir dos arquivos de ajuda que se as consultas em vários segmentos compartilham um único objeto de conexão, o consultas serão executados em série, em vez de simultaneamente. Com um objeto de conexão em cada segmento, isso não deve ser um problema, mas eu sou perguntando sobre as consultas que fazem não tem um objeto de conexão atribuído. Será que eles vão ser considerados em conexões independentes de Do ponto de vista de multithreading concorrência, ou eles vão ser considerado na mesma ligação e, portanto, tem que ceder a cada outra?

Resposta (Jeremy):

Você vai precisar para resolver esta questão. Eles só vão procurar uma lista global de conexões para encontrar um com o mesmo caminho, e eles vão usar essa conexão. Não é bom em uma aplicação multi-threaded.

Assim, a partir resposta de Jeremy é melhor para criar pelo menos um objeto TAdsConnection para cada thread e garantir que todas as consultas estão ligados a ele, caso contrário serialização podem ocorrer.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top