Ir para conteúdo

POWERED BY:

Arquivado

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

mvg

Problemas com conexões

Recommended Posts

Olá!

 

Está acontecendo algo estranho num projeto que foi implantado no ambiente do cliente, a linguagem é ASP, o banco é PostGre, o sistema é uma intranet, há vários usuários acessando as páginas e existe uma área administrativa para alterar essa intranet.

O que ocorre é que são criadas várias instâncias do Postgre, aparentemente, a partir do sistema. Quando o cliente dá um CTRL + ALT + DEL no servidor e olha os programas em execução, tem lá um monte de Postgres abertos. Como não fui eu que desenvolvi o sistema, não tenho muito idéia do que pode estar gerando esse problema.

Vou colar aqui o código do arquivo de conexão e de como é feito um acesso ao banco:

 

Conexão (é um include chamado conexao.asp):

 

Set conexao = Server.CreateObject("ADODB.Connection")conexao.ConnectionTimeout = 10conexao.CommandTimeout = 5conexao.Mode = 3 'adModeReadWrite If conexao.state = 0 Then	 conexao.open "DRIVER={PostgreSQL};DSN=informazione;SERVER=10.1.1.11;port=5432;DATABASE=informazione;UID=informazione;PWD=inf2006;"End Ifconexao.CursorLocation = 3

Exemplo de Select:

 

<!--#include file="conexao.asp"-->sql = "SELECT idsecao, titulo, idsecaomae FROM TABLE WHERE idsecaomae = 0 and idsecao <> 17"	Set rs = Server.CreateObject("ADODB.Recordset")	rs.cursorlocation=3rs.open sql,conexaowhile not rs.eof(...)

Alguém saberia me dizer o por que de vários Postgre estarem sendo abertos?

 

Obrigada desde já!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Provávelmente, os objetos ctriados para se trabalhar com as conexões, não estão sendo destruídos ao final do processamentoSet objConexao = Nothing

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigada pela resposta. :)Inicialmente eu pensei isso também, fechei todas as conexões (conexao.close) e destruí todos os objetos de conexões (set conexao = nothing). Mas, pelo que parece não é esse o problema. Além do mais, acho estranho que o Postgre seja aberto, achava que o acesso ao banco acontecia no servidor sem a necessidade de uma instância do Postgre ser automaticamente iniciada. Não é assim?A propósito, alguém sabe o que a propriedade cursorlocation do objeto de conexão significa?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto ao postgree eu não conheço muito...realmente, quando a aplicação se conecta no banco de dados, quem gerencia isso é o SGBD(Sistema de gerenciamento do banco de dados) que tem um POOL de conexões. É muito estranho que haja tantas instâncias assim do postgree, como se ele estivesse sendo executado diversas vezes. Tente ler a documentação do banco, talvez lá você encontre a resposta do seu problema.

 

Quanto ao cursorlocation, existem diversas matérias publicadas em sites. Uma que eu achei bem completa é: http://www.linhadecodigo.com.br/artigos.asp?id_ac=417&pag=2

 

um grande abraço

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bem interessante a matéria que você me mandou. Será que esse cursorlocation pode ter algo a ver com o problema? Não sei muito sobre o pool de conexões... será que existe alguma configuração para se usar um pool de conexões ou não? Será que o banco está configurado para não ter pool?

Compartilhar este post


Link para o post
Compartilhar em outros sites

O Pool de conexões nada mais é do que um gerenciador das conexões estabelecidas entre aplicação e base de dados. As configurações que você geralmente faz são de timeOut(tempo da conexão) e número máximo de conexões permitidas.Não acredito que o problema esteja relacionado ao cursorLocation pois isso é uma propriedade do objeto RecordSet e não do objeto Conexão.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Quanto ao cursor location, eu também pensei que fosse só uma propriedade para record set, mas o objeto de conexão (Server.CreateObject("ADODB.Connection")) também tem cursor location, pesquisei e vi que em vários lugares se inicia uma conexão e seta o cursor location desse objeto de conexão para 3.

 

No código que eu colei do include de conexão , inclusive, tem assim:

 

conexao.CursorLocation = 3

Será que o connectiontimeout (10) está muito grande? E o commandTimeOut (5)?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Mas se você está destruindo o objeto de conexão, você não concorda que o cursor location tb está sendo destruído?O timeout é medido em segundos...otempo está bom...Se sua aplicação está destruindo os objetos de conexão tudo certinho como você disse:

Obrigada pela resposta. Inicialmente eu pensei isso também, fechei todas as conexões (conexao.close) e destruí todos os objetos de conexões (set conexao = nothing). Mas, pelo que parece não é esse o problema. Além do mais, acho estranho que o Postgre seja aberto, achava que o acesso ao banco acontecia no servidor sem a necessidade de uma instância do Postgre ser automaticamente iniciada. Não é assim?A propósito, alguém sabe o que a propriedade cursorlocation do objeto de conexão significa?

não acredito que seja sua aplicação que esteja instanciando tantos objetos assim....aí você tem que contar com alguém de infra ou um arquiteto de solução para te auxiliar com seu problema....

Compartilhar este post


Link para o post
Compartilhar em outros sites

você disse que não foi voce que programou o sistema inicialmente,Ja chegoua verificar se todas as páginas que tem que destruir o objeto de conexão estão realmente destruindo?Pode ter passado algumas despercebidas. Já aconteceu isso comigo.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá de novo, continuando a conversa...

 

Eu olhei as páginas sim, tem uma que me deixou em dúvida. Ela é, em resumo, é assim:

 

include do arquivo de conexão (onde é criado o objeto de conexão)include de um arquivo de 'negócios' que faz vários acessos ao banco, utilizando esse objeto de conexãoconexao.closeset conexao = nothing

Será que nesse arquivo de negócios, a cada acesso ao banco, cria uma nova conexão? Será que eu teria que fechar a conexão dentro desse arquivo, ao invés de após o include dele?

 

E quanto ao timeout da conexão, existe alguma propriedade no banco de também controla isso ou esse valor é setado apenas na aplicação? Existe a possibilidade de no banco estar com um timeout maior do que o que eu determinei no arquivo de conexão?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Isso você tem que ver no seu código fonte....pois quando você coloca um set objConexao = Nothing ele mata apenas a conexão aberta naquela página...se em outras você abriu e não destruiu o objeto, elas vão continuar abertas.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Achei uma linha de código em aparece várias vezes em uma das páginas mais visitadas. É a seguinte:

 

recordSet.ActiveConnection = conexao

Pelo que me parece, essa linha abre uma segunda conexão. Para usar a mesma conexão, que já foi criada, acho que teria que ter um 'set' na frente, tipo assim:

 

set recordSet.ActiveConnection = conexao

Alguém poderia me confirmar a diferença de ter o 'set' na frente ou não? Lembro de já ter lido em algum lugar que sem o 'set' na frente é o equivalente a um 'let', é verdade?

 

Obrigada pelas respostas!

 

Outra coisa que fiquei sabendo é que o banco de dados estava sem timeout, não sei se isso tem a ver, mas talvez setar o timeout da conexão no código não adiante de nada, se o banco estiver sem timeout.

Compartilhar este post


Link para o post
Compartilhar em outros sites

entao velhinho, se páá o set é quando você quer guardar um recordSettipo:set rs = bd.execute("select * from tabela")dai o set vai receber todos os dados retornadoja sem o set, você ira executar algo no bancotipo:bd.execute("delete tabela where id = 1")é isso aeeeee... falow

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.