Fórum Velocidade na consulta a bd usando Indy #321739

19/05/2006

0

Bom dia pessoal..
Queria pegar algumas opiniões e tirar algumas dúvidas com vcs se possível!!
Tenho dois programas..
O Primeiro através de um Indy(Cliente) me envia uma placa. ex CVT5856
O outro programa através de um Indy(Servidor) recebe a string.
eu pego essa string e consulto no meu bd para ver se a placa existe..
se existir eu gravo os dados na tabela registro..

Fiz de um jeito aqui mas não estou satisfeito com os resultados.. não sei se a forma está correta..

no cliente envio
idtcpclient1.writeln(placa);

no servidor (método onExecute) recebo a string
placa := Athread.Connection.Readln;

recebendo essa placa eu uso o findkey para pesquisar.
Dados.Veiculos.findkey([placa])
se existir eu gravo

database.starttransaction
registro.placa := placa; etc...
database.commit

mas está acontecendo umas coisas meio malucas aqui.. tipo. de vez em qdo não grava determinado campo..
e não sei se o findkey é o mais aconselhável...
e qual a real velocidade que posso enviar a string pelo cliente..
pq são mtos veículos, tipo 2 ou 3 por segundo..

Que vcs me aconselham..
obrigado
Eric


Eric.miranda

Eric.miranda

Responder

Posts

19/05/2006

Massuda

Indy é multithread e geralmente isso não combina bem com BD; provavelmente você está fazendo as operações em BD dentro da thread de cada cliente no servidor Indy (a TIdPeerThread).

Para evitar maluquices no seu BD, você precisa garantir que está fazendo as operações de BD de modo a suportar multithread. Isso geralmente significa que você precisa ter uma conexão com o BD para cada cliente conectado no servidor Indy ou você tem que implementar um mecanismo que bloqueie o acesso simultaneo de diferentes clientes ao BD (semáforo, critical section, etc). Não entendo muito de BD para poder detalhar mais isso.


Responder

Gostei + 0

19/05/2006

Eric.miranda

Valeu Massuda pela resposta..
eu vou ter apenas um servidor e um cliente..
cada msg enviada é tratada pelo servidor como cliente diferente??
O meu grande medo é o seguinte..
enquanto eu estou gravando o registro no bd, ele queira gravar outro e outro..aí ficaria uma fila para gravação..e poderia me gerar problemas..
Será que eu mudando de BDE para DBexpress melhoraria algo??

valew


Responder

Gostei + 0

19/05/2006

Massuda

cada msg enviada é tratada pelo servidor como cliente diferente??
Cada conexão é um cliente no lado do servidor (onde está o TIdTCPServer). Se seu programa abre 4 conexões (4 TIdTCPClient por exemplo), no servidor abrem 4 threads para cuidar das conexões.

Sobre ´formar fila´, depende de como seus programas estão feitos. Note que no lado do cliente (onde está o TIdTCPClient), qualquer envio de dados para o lado do servidor só retorna (TIdTCPClient.WriteLn por exemplo) quando o servidor completa a operação.


Responder

Gostei + 0

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

Aceitar