Fórum Como funciona Sockets #298726

07/10/2005

0

é o seguinte.
nas 8 filiais da empresa, criei um soft, que envia dados para a matriz, por meio de sockets.

quando os dados chegam, são processados para que possam ser armazenados em interbase SQL via programacao no delphi,nos campos da minha tabela no interbase, (insert into ... ..)

alguns dados foram misturados, entao peço a ajuda com estas perguntas.

Quando mais de uma pessoa envia dados para a matriz, o socket servidor espera um chegar e depois recebe o outro ?

Caso eu esteja percorrendo o registro deste modo:
query1.first
,
(while not query1.eof then ........)
, quando eu receber algum dado de alguma matriz, vai interferir no processo de gravacao ?

muuuuito obrigado.


Geisonc

Geisonc

Responder

Posts

07/10/2005

Massuda

Quando mais de uma pessoa envia dados para a matriz, o socket servidor espera um chegar e depois recebe o outro ?
Depende de como o servidor foi feito.

Normalmente, cada pessoa conectada é tratada em paralelo pelo servidor. O protocolo de comunicação garante que os dados de uma pessoa não se misturam com o dados da outra.

Com relação ao BD em si, se seu servidor for multithread, é melhor que cada thread possua sua própria conexão com o BD ao invés de compartilhar a mesma conexão entre as threads.


Responder

Gostei + 0

07/10/2005

Firekiller

Pessoal, desculpem mas vou aproveitar a deixa para me esclarecer uma dúvida... Massuda, por quê você diz que é melhor que cada thread tenha uma conexão (quais os prós e contras) ?? Eu normalmente tenho uma única conexão para todas as threads e não tenho problemas...

Outra pergunta seria, fazendo da forma como você disse, não haveria a necessidade de uma compra de outra licença do banco (no caso de ser oracle, db2, etc)??


Responder

Gostei + 0

07/10/2005

Massuda

...é melhor que cada thread tenha uma conexão (quais os prós e contras) ??
Não é muito questão de pró e contras... é que muito driver de acesso ao BD (software cliente) é não é feito para permitir, por exemplo, duas queries rodando na mesma conexão em paralelo.

Uma alternativa é limitar o número de conexões em uso (por exemplo, use um pool de conexões) ou use uma única conexão e controle o acesso das threads a essa conexão usando um semáforo.


Responder

Gostei + 0

08/10/2005

Ipc$

é que muito driver de acesso ao BD (software cliente) é não é feito para permitir, por exemplo, duas queries rodando na mesma conexão em paralelo.
Compartilho várias queries em threads utilizando a mesma conexão e até hoje não tive problemas. Poderia mencionar qual Banco e qual driver não aceitariam esse tipo de processamento ?


Responder

Gostei + 0

08/10/2005

Firekiller

Massuda, eu tenho um sistema rodando assim, com uma única conexão, e uso DBExpress, com Firebird, acessando com driver que acompanha o Delphi, e não tive problemas, nem mesmo com usuários acessando simultaneamente o mesmo registro (fizemos testes com 4 máquinas acessando simultaneamente o mesmo registro). Todas as máquinas iniciaram a edição juntas e salvaram juntas, e tudo ocorreu a contento... mas você disse a respeito de usar um semáforo... a implementação daria mais segurança as informações??? daria muito trabalho para implementar ??


Responder

Gostei + 0

08/10/2005

Massuda

[quote:99c73d7f16=´ipc$´]Poderia mencionar qual Banco e qual driver não aceitariam esse tipo de processamento ?[/quote:99c73d7f16]O software do BD (Oracle, MySQL, etc) geralmente é thread safe, mas dependendo do BD e da versão do software, pode não ser ou pode exigir algum tipo de configuração especial. Me parece que o IB6 tem algumas restrições para poder ser usado de modo thread safe.

Já o mecanismo de acesso pode não ser thread safe. Por exemplo, o dbExpress é feito para ser thread safe se cada thread tiver seu próprio TSQLConnection e todos os DataSets da thread usarem essa mesma conexão. (Não saberia dizer onde isso está escrito ou dito)

O que pode ocorrer é você ter diversas threads compartilhando uma conexão de modo sincronizado (direta ou indiretamente) ou você não ter acesso concorrente/paralelo ao BD devido às condições de trabalho do seu programa (sorte?).

não haveria a necessidade de uma compra de outra licença do banco (no caso de ser oracle, db2, etc)??
Um colega me indicou a seguinte implementação de um pool de conexões TSQLConnection: [url=http://bdn.borland.com/article/0,1410,30027,00.html]Using Semaphores in Delphi, Part 2: The Connection Pool[/url] (pode ser que tenha que fazer login ou se registrar gratuitamente no site da Borland para acessar o artigo e código fonte).


Responder

Gostei + 0

09/10/2005

Ipc$

Olá Massuda, obrigado pela resposta.
Utilizo o IB6 com BDE ou IBX e ele sempre respondeu todas as queries Select, Insert, Update e Delete rodando em threads paralelas com a mesma conexão. O que pode estar acontecendo é o Banco de Dados serializar as solicitações; ou seja; quando duas threads solicitam ao Banco, ele processa a primeira para depois processar a segunda; ao passo que se houverem duas conexões, a resposta seria mais rápida. Mas isso já seria uma questão de performance, contudo o IB6 com esses meios de acesso está respondendo satisfatoriamente.


Responder

Gostei + 0

10/10/2005

Massuda

[quote:c52dcbebfc=´ipc$´]...O que pode estar acontecendo é o Banco de Dados serializar as solicitações...[/quote:c52dcbebfc]Sim, isso tornaria o mecanismo de acesso thread-safe sem precisar usar múltiplas conexões.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar