ActiveDelphi - Índice do Fórum ActiveDelphi
.: O site do programador Delphi! :.
 
 FAQFAQ   PesquisarPesquisar   MembrosMembros   GruposGrupos   RegistrarRegistrar 
 PerfilPerfil   Entrar e ver Mensagens ParticularesEntrar e ver Mensagens Particulares   EntrarEntrar 

Comportamento Estranho (Cliente-Servidor)

 
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi
Exibir mensagem anterior :: Exibir próxima mensagem  
Autor Mensagem
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Ter Jan 17, 2012 10:21 am    Assunto: Comportamento Estranho (Cliente-Servidor) Responder com Citação

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 Wink

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
felipecaputo
Colaborador
Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010
Mensagens: 1719
Localização: Florianópolis / SC

MensagemEnviada: Ter Jan 17, 2012 2:00 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Ter Jan 17, 2012 2:51 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
Djarum
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 1 de Junho de 2011
Mensagens: 296

MensagemEnviada: Ter Jan 17, 2012 3:00 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Ter Jan 17, 2012 3:34 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
felipecaputo
Colaborador
Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010
Mensagens: 1719
Localização: Florianópolis / SC

MensagemEnviada: Ter Jan 17, 2012 3:39 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Ter Jan 17, 2012 3:44 pm    Assunto: Responder com Citação

felipecaputo escreveu:
Já tentou SQLConnection.CloseDataSets?

Já sim Felipe!
Ele executa o método mas continua dando o erro...
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
Djarum
Aprendiz
Aprendiz


Registrado: Quarta-Feira, 1 de Junho de 2011
Mensagens: 296

MensagemEnviada: Ter Jan 17, 2012 3:57 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular MSN Messenger
felipecaputo
Colaborador
Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010
Mensagens: 1719
Localização: Florianópolis / SC

MensagemEnviada: Ter Jan 17, 2012 4:15 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Ter Jan 17, 2012 4:17 pm    Assunto: Responder com Citação

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. Wink
Voltar ao Topo
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Ter Jan 17, 2012 4:26 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
felipecaputo
Colaborador
Colaborador


Registrado: Quinta-Feira, 13 de Mai de 2010
Mensagens: 1719
Localização: Florianópolis / SC

MensagemEnviada: Ter Jan 17, 2012 4:28 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Enviar E-mail Visitar a homepage do Usuário MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Ter Jan 17, 2012 4:41 pm    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Qua Jan 18, 2012 10:07 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
JCMF
Profissional
Profissional


Registrado: Quarta-Feira, 28 de Abril de 2010
Mensagens: 578
Localização: Recife, PE

MensagemEnviada: Qui Jan 19, 2012 10:51 am    Assunto: Responder com Citação

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
Ver o perfil de Usuários Enviar Mensagem Particular Visitar a homepage do Usuário MSN Messenger
Mostrar os tópicos anteriores:   
Novo Tópico   Responder Mensagem    ActiveDelphi - Índice do Fórum -> Delphi Todos os horários são GMT - 3 Horas
Página 1 de 1

 
Ir para:  
Enviar Mensagens Novas: Proibido.
Responder Tópicos Proibido
Editar Mensagens: Proibido.
Excluir Mensagens: Proibido.
Votar em Enquetes: Proibido.


Powered by phpBB © 2001, 2005 phpBB Group
Traduzido por: Suporte phpBB