Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Rodrigo Duran

Erro em tempo de execução [Firebird+DbExpress]

Recommended Posts

Bom dia a todos,

 

Tenho um sistema (delphi 7, Firebird 2, DbExpress) onde um conjunto de Threads acessam o banco de dados para checar os dados de acordo com a entrada de cada Thread.

 

O sistema funciona muito bem até um certo período (o sistema no caso é um servidor) . Quando o sistema está rodando por mais de 8 horas ele apresenta problemas para criar as novas conexões TSQLconnection para cada Thread, gerando uma exceção. O meu uso é bem simples do banco, geralmente

 

<Abre conexão>

<Algo SQL>

<Execute ou Open>

<Close Conexão>

 

Ou seja, a conexão não precisa ser persistente , apenas momentãnea.

Li em outros lugares que este problema pode ser por excesso de conexões concorrentes no banco. ou seja , mesmo eu chamando o close dentro do Firebird a conexão não é fechada, gerando overflow no MaxConnections.

 

1) Existe um meio de "forçar" o firebird a fechar a minha conexão?

2) Existe um meio de saber quantas conexões concorrentes estão em uso no momento? Note que são conexões e não usuários

 

Grato

 

Rodrigo Duran

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom dia Marcio,

 

Dentro da aplicação eu fecho a Query e fecho a conexão (Q.Close e <Conexao>.Connected := False)

Até ai sem problemas , como eu disse por várias horas o sistema roda estável (Nota: Para efeitos de avaliação o sistema faz 4 acessos ao banco por segundo, logo cada thread concorrente que acessa o banco tem a a sua própria SQLConnection). O problema ocorre após várias horas ( +10 horas) , onde eu tento criar uma nova conexão e o banco de dados gera uma exeção dizendo que não foi possivel alocar os recursos para a requisição. Lendo em alguns tópicos acabei tendo a noção ( a mais plausível até o momento para mim )que tal erro foi gerado por overflow no número de conexões ativas dentro do banco, ou seja, apesar de eu fechar as conexões e querys, dentro do SGBD do Firebird elas ainda continuam ativas . Mas isso é obviamente uma conclusão, por isso gostaria de saber se existe um meio de saber quantas conexões ativas existem dentro do Firebird pra saber se é realmente esse o problema e se for como eu posso forçar o firebird a fechar a conexão "na marra".

Compartilhar este post


Link para o post
Compartilhar em outros sites

Particularmente não sei como descobrir o número de conexões existentes, tive o mesmo problema que você no tempo que mexia com interbase, tinha um aplicativo que fazia um meio de campo entre outros dois, acontecia o mesmo problema do número de conexões, cheguei a conclusão idêntica a sua, de que mesmo pedindo para desconectar, ele continua com a instância de conexão, e então consegui resolver isto criando um outro aplicativo, fiz o seguinte, o aplicativo que fica no meio de campo, depois que ele termina o processo, ele chama um outro aplicativo e se fecha, este outro aplicativo espera uns 5 segundos e chama novamente o meu aplicativo do meio de campo, ou seja, assim pelo visto você acaba forçando a quebra das conexões, pelos menos aqui para mim funcionou perfeitamente.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Boa tarde Marcio,

 

Bom , pensando em um metodo para validar a teorica eu fiz uma simples aplicação :

 

While True do

<executa procedure com SQLConnection>

end;

 

a tal procedure é algo assim :

 

SQLConnection.Create ... etc (inicializar a SQL Connection)

Q.Create (Cria Query)

 

<Usa a query pra qualquer coisa>

 

Q.Close;

SQLConnection.Close;

FreeAndNil(Q);

FreeAndnil(SQLConnection)

 

Consegui realizar 30 mil requisiçoes de conexão desse modo ! E realmente deu o problema que tinha dado anteriormente . Mas, para minha surpresa, em modo debug, a exception gerada NÃO é de overflow nas conexões com o banco e sim overflow na memória ! Acompanhei o andamento e ao que parece o delphi não está liberando a memória quando eu dou o Free na conexão e na query, logo depois de um certo tempo o programa da um overflow na pilha de memória alocada pra ele !!

Alguma sugestão???

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.