[Resolvido!] Dúvida: É correto que cada método de classe java abra uma conexão com o postgres?

5 respostas
Kleber-rr

Olá pessoal, boa tarde.

Me desculpem caso este tópico estaja no lugar errado…

Estou passando por um problema, e antes que eu ponha a culpa no meu gerenciamento do Banco de dados pelo Postgres, quero tirar essa dúvida com vcs do GUJ.

Possuo uma aplicação java web que, utiliza JSP, hibernate, c3p0 e conexão JDBC com o postgreSQL (que está configurado para 100 usuários - padrão);

As informações trabalhadas são armazenadas em sessões sempre que necessário, e as mesmas são limpas ou fechadas quando necessário;

Algumas outras informações são armazenadas em httpSessions, por serem necessárias para realizar filtragens em determinados momentos da aplicação;

Como foi dito, utilizando o hibernate e o JDBC, foi criado um usuário específico no banco de dados para trabalhar junto a esta aplicação, com o nome de “user”;

Agora o problema: quando se inicia o acesso ao sistema e no decorrer do trabalho, após algum tempo de trabalho do sistema, realizando consultas, cadastros ou outras operações, o sistema trava algumas operações (em geral, as que precisam dos dados gravados na httpSession) pela quantidade de conexões ao banco ter ultrapassado as 100 conexões (padrão do postgre).

Quanto eu faço o monitoramento no banco para ver a quantidade de usuários conectados ao banco, vejo que o usuário criado especificamente para a interação banco/aplicação, no meu caso o “user” só possui uma (01) conexão aberta com o banco, enquanto que o usuário padrão do postgreSQL, o “postgres” está com 99 conexões.

O que vocês do GUJ acham que pode ser?

Obrigado pelas colaborações.

5 Respostas

DZR

Realmente é necessário manter a conexão de banco de dados aberta o tempo todo?

Eu geralmente fecho as conexões depois que o que eu precisei fazer com o banco de dados. Assim eu evito esse excesso de conexões.

Kleber-rr

DZR:
Realmente é necessário manter a conexão de banco de dados aberta o tempo todo?

Eu geralmente fecho as conexões depois que o que eu precisei fazer com o banco de dados. Assim eu evito esse excesso de conexões.

Então, DZR, antes de tudo, obrigado por responder.

Cara, o problema é que essas conexões excessivas não são criadas pelo usuário da aplicação. Como eu disse, criei um usuário no banco chamado “user” e só ele é instanciado pelo hibernate no JDBC para realizar toda comunicação com o banco de dados. O usuário “postgres”, responsável pelo excesso de conexões, está de “gaiato no navio”, pois minha aplicação não utiliza este usuário.

Abs.

gabiso

Experimente modificar senha do usuario ‘postgres’. Caso seja sua aplicação que está utilizando ele, vai dar erro de autenticação na aplicação.

Voce pode tentar mudar a forma de conexão… Como voce está utilizando hibernate, crie um pool de conexões com outro usuário e com um timeout para que as conexões fechem quando ociosas por muito tempo.

CintiaDR

Faz muito tempo que não mexo com o postgres, mas olhe, não chego nem perto de lembrar de algo assim. Não aconteceu comigo MESMO.

Faz assim, tira o c3p0 (não que ele que esteja causando, mas quem sabe esteja mascarando algo…).

Também liga o banco e deixa ele lá ‘sozinho’, sem aplicação, veja se algo assim acontece.

Kleber-rr

gabiso:
Experimente modificar senha do usuario ‘postgres’. Caso seja sua aplicação que está utilizando ele, vai dar erro de autenticação na aplicação.

Voce pode tentar mudar a forma de conexão… Como voce está utilizando hibernate, crie um pool de conexões com outro usuário e com um timeout para que as conexões fechem quando ociosas por muito tempo.

Olá gabiso, bom dia.
Meu amigo, segui seu conselho e me dei conta de que, em 10% das classes DAO do meu projeto, as consultas eram realizadas através da Connection, passando um: DriverManager .getConnection("jdbc:postgresql://localhost:5432/banco" + "?user=" + userbd + "&password=" + passw);
Nesse ponto, eu tinha o usuário postgres realizando as consultas pra mim. O que resolveu minha dúvida, mas não o meu problema.

Vou tentar agora realizar as consultas utilizando a criteria e substituir essas classes extendendo-as ao Dao.

Como minha dúvida foi solucionada, agradeço a todos e em especial ao gabiso pela dica que valeu ouro, e deixo o tópico como resolvido.

Obrigado a todos.

Criado 25 de agosto de 2011
Ultima resposta 26 de ago. de 2011
Respostas 5
Participantes 4