Exibir mensagem anterior :: Exibir próxima mensagem |
Autor |
Mensagem |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Ter Jan 17, 2012 10:21 am Assunto: Comportamento Estranho (Cliente-Servidor) |
|
|
Bom dia amigos.
Depois de todos os problemas, até então, resolvidos com a ajuda de vcs... me surgiu uma novidade.
Na verdade, é um comportamento meio que estranho e que ocorre de vez em quando. Espero que alguns de vcs já tenham passado por isso para que possa me dar alguma dica
Tenho dois aplicativos, Cliente e Servidor, rodando via Datasnap de forma normal. Mas, algumas vezes e sem motivo aparente, quando finalizo a aplicação cliente de forma normal (via debug ou não), ela dá um erro e, logo em seguida, a aplicação servidor tb dá um erro.
Seguem as imagens na sequencia: 1º erro na aplicação cliente, 2º erro na aplicação servidor.
Erro da aplicação Cliente, quando é fechada de forma normal.
Erro da aplicação Servidor, depois que a aplicação cliente fecha e dá o erro acima.
 |
|
Voltar ao Topo |
|
 |
felipecaputo Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010 Mensagens: 1719 Localização: Florianópolis / SC
|
Enviada: Ter Jan 17, 2012 2:00 pm Assunto: |
|
|
Olá amigo,
Já tentou garantir a desconexão antes de finalizar a aplicação?
O client possui mais de uma conexão com o servidor?
No servidor, os seus ServerMethods estão como Server, Session ou Instance? _________________ if Post.State = psResolvido then
Post.Caption := Post.Caption + ' [RESOLVIDO]';
_____________________________________________
O único homem que está isento de erros, é aquele que não arrisca acertar. Albert Einstein |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Ter Jan 17, 2012 2:51 pm Assunto: |
|
|
felipecaputo escreveu: | Olá amigo,
Já tentou garantir a desconexão antes de finalizar a aplicação?
O client possui mais de uma conexão com o servidor?
No servidor, os seus ServerMethods estão como Server, Session ou Instance? |
1º) Coloquei um Close forçado na conexão Datasnap com a aplicação servidor para testar mas o erro, apesar de ser esporádico, ainda continua.
2º) Criei uma classe chamada TDataSnapConnection que gerencia a conexão Datasnap com a aplicação servidor. Só existe ela para toda a aplicação cliente.
3º) Todos os ServerMethods criados na aplicação servidor são registrados como SESSION para garantir uma sessão única para cada cliente conectado. |
|
Voltar ao Topo |
|
 |
Djarum Aprendiz


Registrado: Quarta-Feira, 1 de Junho de 2011 Mensagens: 296
|
Enviada: Ter Jan 17, 2012 3:00 pm Assunto: |
|
|
Falai man,
Eu tive esse mesmo problema usando Socket's (Client/Server); Acontecia de dar uma mensagem semelhante a sua no cliente; Coloquei uma função no Client que verifica se ele está conectado antes de desconectar.
Aqui resolveu. |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Ter Jan 17, 2012 3:34 pm Assunto: |
|
|
Djarum escreveu: | Falai man,
Eu tive esse mesmo problema usando Socket's (Client/Server); Acontecia de dar uma mensagem semelhante a sua no cliente; Coloquei uma função no Client que verifica se ele está conectado antes de desconectar.
Aqui resolveu. |
Aqui está o código completo do método para realizar o fechamento da conexão:
Código: | procedure TDataSnapConnection.Disconnect;
begin
if SQLConnection <> nil then
if SQLConnection.Connected then
SQLConnection.Close;
end; |
Quando estou executando via debug, o Delphi percebe que SQLConnection está diferente de nil e entra o segundo condicional.
Nesse segundo condicional, o Delphi percebe que SQLConnection.Connected está True (ou seja, a conexão ainda está ativa).
Porém, quando o Delphi vai executar o SQLConnection.Close... o erro acontece!
Nem Close, nem Free, nem a função FreeAndNil() resolveram essa resenha =\ |
|
Voltar ao Topo |
|
 |
felipecaputo Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010 Mensagens: 1719 Localização: Florianópolis / SC
|
Enviada: Ter Jan 17, 2012 3:39 pm Assunto: |
|
|
Já tentou SQLConnection.CloseDataSets? _________________ if Post.State = psResolvido then
Post.Caption := Post.Caption + ' [RESOLVIDO]';
_____________________________________________
O único homem que está isento de erros, é aquele que não arrisca acertar. Albert Einstein |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Ter Jan 17, 2012 3:44 pm Assunto: |
|
|
felipecaputo escreveu: | Já tentou SQLConnection.CloseDataSets? |
Já sim Felipe!
Ele executa o método mas continua dando o erro... |
|
Voltar ao Topo |
|
 |
Djarum Aprendiz


Registrado: Quarta-Feira, 1 de Junho de 2011 Mensagens: 296
|
Enviada: Ter Jan 17, 2012 3:57 pm Assunto: |
|
|
Já testou também os dois juntos?
Código: |
procedure TDataSnapConnection.Disconnect;
begin
if (SQLConnection <> nil) and (SQLConnection.Connected) then
begin
SQLConnection.Close;
end;
end;
|
Esse componente é criado em tempo de execução? |
|
Voltar ao Topo |
|
 |
felipecaputo Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010 Mensagens: 1719 Localização: Florianópolis / SC
|
Enviada: Ter Jan 17, 2012 4:15 pm Assunto: |
|
|
não está ficando algo em execução ou em comunicação quando o sistema está fechando?
vc usar timer ou thread? _________________ if Post.State = psResolvido then
Post.Caption := Post.Caption + ' [RESOLVIDO]';
_____________________________________________
O único homem que está isento de erros, é aquele que não arrisca acertar. Albert Einstein |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Ter Jan 17, 2012 4:17 pm Assunto: |
|
|
Djarum escreveu: | Já testou também os dois juntos?
Código: |
procedure TDataSnapConnection.Disconnect;
begin
if (SQLConnection <> nil) and (SQLConnection.Connected) then
begin
SQLConnection.Close;
end;
end;
|
Esse componente é criado em tempo de execução? |
O teste realizado é exatamente este do seu exemplo.  |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Ter Jan 17, 2012 4:26 pm Assunto: |
|
|
felipecaputo escreveu: | não está ficando algo em execução ou em comunicação quando o sistema está fechando?
vc usar timer ou thread? |
Não uso timer nem threads amigo... A única coisa diferente que estou utilizando é o TDBXCommand... Pq não quero ficar utilizando o Proxy =\
Segue um exemplo:
Código: | procedure TFormEmpresa.SetLastCompany;
var
DBXCommand: TDBXCommand;
JSONEmpresa: TJSONValue;
begin
DBXCommand := DataSnapConnection.DBXConnection.CreateCommand;
try
DBXCommand.CommandType := TDBXCommandTypes.DSServerMethod;
DBXCommand.Text := 'TServerModuleEmpresa.GetById';
DBXCommand.Prepare;
DBXCommand.Parameters[0].Value.SetInt32( FLastCompanyId );
DBXCommand.ExecuteUpdate;
{ ** Recuperando o retorno do comando realizado ** }
JSONEmpresa := DBXCommand.Parameters[1].Value.GetJSONValue( False );
{ ** Convertendo o objeto recuperado para o tipo TEmpresa ** }
lastCompany := TEmpresa.JSONToClass<TEmpresa>( JSONEmpresa );
finally
FreeAndNil( DBXCommand );
FreeAndNil( JSONEmpresa );
end;
end; |
Porém, executo o método com o parâmetro InstanceOwner como False... dessa forma, a minha chamada fica encarregada de liberar o objeto como ocorre no no bloco finally...
No mais, não consigo ver outra coisa que possa ocasionar isso =\ |
|
Voltar ao Topo |
|
 |
felipecaputo Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010 Mensagens: 1719 Localização: Florianópolis / SC
|
Enviada: Ter Jan 17, 2012 4:28 pm Assunto: |
|
|
Já testou não fechar a conexão ou trocar o owner da instancia? _________________ if Post.State = psResolvido then
Post.Caption := Post.Caption + ' [RESOLVIDO]';
_____________________________________________
O único homem que está isento de erros, é aquele que não arrisca acertar. Albert Einstein |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Ter Jan 17, 2012 4:41 pm Assunto: |
|
|
felipecaputo escreveu: | Já testou não fechar a conexão ou trocar o owner da instancia? |
Sobre não fechar a conexão, era assim quando começou a dar esse erro... por isso decidi realizar o fechamento da mesma.
Já troquei o instance owner para True sim, mas aparentemente não surtiu efeito. =(
A mensagem "connection reset by peer" significa "conexão fechada pela ponta". Pelo que entendo, já que essa mensagem é dada pela aplicação servidor, é como se a aplicação cliente fosse finalizada sem fechar a conexão com o servidor.
Estranho demais. =\\ |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Qua Jan 18, 2012 10:07 am Assunto: |
|
|
Depois de alguns testes para descobrir o problema... constatei que o erro acontece no TDSProviderConnection.
Na lógica, é preciso dois componentes básicos para se ter um Dataset via Datasnap: o TClientDataSet e o TDSProviderConnection.
A ligação entre eles tb é básica. Mas, quando comentei a linha em que a conexão é definida para o TDSProviderConnection, o erro parou de dar! (??)
Exatamente nessa linha abaixo:
Código: | prcPrincipal.SQLConnection := DatasnapServer.SQLConnection; |
Se ela for comentada, a exceção para de ser levantada.
Alguma dica? |
|
Voltar ao Topo |
|
 |
JCMF Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010 Mensagens: 578 Localização: Recife, PE
|
Enviada: Qui Jan 19, 2012 10:51 am Assunto: |
|
|
O problema foi "resolvido" da seguinte forma:
Simplesmente removi a linha que realiza a desconexão com a aplicação servidor. (??)
Esse trecho de código não é mais realizado pela aplicação cliente:
Código: | DataSnapClient.Disconnect; |
Porém, não consegui entender o motivo... |
|
Voltar ao Topo |
|
 |
|