Como se fecha uma conexão usando JDBC?  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
mateusviccari
JavaGuru

Membro desde: 18/11/2010 18:57:50
Mensagens: 238
Offline

Olá, estou fazendo um programa que usa conexão com o Postgres, fiz um cadastro de clientes e pra teste inclui 10.000 egistros pra ver como se comportava.
Fiz uma janelinha tambem pra mostrar as informações dos clientes, aonde tenho uma tabela que mostra todos os clientes cadastrados, e na tabela fiz um evento que cada vez que o usuario pressionasse tecla pra cima ou pra baixo pra selecionar o proximo registro ou o anterior, ele carregasse umas informações adicionais em baixo da tabela. ok até ai tudo bem, porem quando o usuario segura a tecla pra baixo continuamente, obrigando o programa a ir descendo rapidamente na tabela de clientes e fazendo muitos selects pra consultar esses dados adicionais, ocorre que em determinado ponto o postgres da um erro dizendo que há muitos usuários conectados(mesmo assim dando OK nesse erro ele continua funcionando normalmente).
Pelo que entendi cada vez que se faz um select ele não fecha a conexão, ficando com muitas conexões abertas na memória, mas como posso fazer pra fechar essas conexões? sendo que estou usando JDBC puro, sem framework, eu armazeno os resultados da consulta em um ResultSet.
mauricioadl
GUJ Master
[Avatar]

Membro desde: 10/05/2007 14:52:21
Mensagens: 1140
Offline

a conexao pode ficar aberta, o correto eh fechar o statement; use seu_statement.close();
recomendo fechar a conexao somente quando encerrar a aplicacao; use sua_conexao.close();

Seu problema foi resolvido? Por favor, edite seu primeiro post e adicione [RESOLVIDO] no título.
O forum agradece.
[Email] [MSN]
lemosxd01
What is classpath?
[Avatar]

Membro desde: 17/06/2011 19:15:21
Mensagens: 7
Offline

posta ai teu codigo parceiro
rafaduka
JavaGuru
[Avatar]

Membro desde: 30/06/2009 20:26:56
Mensagens: 224
Localização: Osasco/SP
Offline

Connection con ...
ResultSet rs ...



etc..

preferencialmente utilize dentro do finally, exemplo:


"dividir e conquistar"
mateusviccari
JavaGuru

Membro desde: 18/11/2010 18:57:50
Mensagens: 238
Offline

Segue meu código, tentei fechar o statement mas continuou dando o mesmo erro:
rafaduka
JavaGuru
[Avatar]

Membro desde: 30/06/2009 20:26:56
Mensagens: 224
Localização: Osasco/SP
Offline

feche o resultado, consulta, conexao respectivamente..

com .close() no final

"dividir e conquistar"
mauricioadl
GUJ Master
[Avatar]

Membro desde: 10/05/2007 14:52:21
Mensagens: 1140
Offline

O problema continua prq vc abre a conexao em todos os selects;

seu codigo precisa de algumas correções.

1º use um fabrica de conexoes, procure aqui no forum que deve ter um monte de coisa a respeito
2º faça com que sua conexão seja um singleton e a mantenha aberta durante o uso da aplicacao, eh menos custoso do que abrir e fechar
3º nunca use statement troque por preparedStatement eh melhor e mais seguro

Seu problema foi resolvido? Por favor, edite seu primeiro post e adicione [RESOLVIDO] no título.
O forum agradece.
[Email] [MSN]
mateusviccari
JavaGuru

Membro desde: 18/11/2010 18:57:50
Mensagens: 238
Offline

obrigado, por enquanto estou fechando a conexão em cada vez que passa pelo select, isso ja resolveu meu problema, mas vou fazer como o amigo ai em cima falou, usando fabrica de conexões, ja percebi que é 1000 x melhor do qe o jeito que estou fazendo.
Esse fórum é demais hehe...
Tchello
GUJ Master
[Avatar]

Membro desde: 07/06/2008 14:41:04
Mensagens: 1695
Offline

mauricioadl wrote:O problema continua prq vc abre a conexao em todos os selects;

seu codigo precisa de algumas correções.

1º use um fabrica de conexoes, procure aqui no forum que deve ter um monte de coisa a respeito
2º faça com que sua conexão seja um singleton e a mantenha aberta durante o uso da aplicacao, eh menos custoso do que abrir e fechar
3º nunca use statement troque por preparedStatement eh melhor e mais seguro


O uso de singletons deve ser feito somente com supervisão de um adulto. Evite-os a todo custo, a grande maioria esmagadora da utilização de Singletons é desnecessária tanto que esse se tornou um anti-padrão documentado (embora esteja como um padrão de projetos no livro do GoF).

Não mantenha uma conexão aberta durante a vida toda da aplicação, no final das contas essa será encerrada pelo próprio SGBD e você morrerá com uma exception ao tentar usa-la.
Isso sem contar que estará guardando um recurso desnecessariamente, aumento o custo computacional da aplicação.

O correto é abrir uma conexão por transação necessária e encerra-la tão logo a transação finalize.
Seria de bom tom (e mais inteligente) o uso de um pool de conexões, deixando que esse gerencie as conexões, cabendo a você pedi-las e devolve-las no inicio e fim das transações respectivamente, ficando transparente a quem a usa detalhes como usuário e senha do banco (algo semelhante a factory de conexões).

Existem dezenas de pools por ai, de uma olhada no C3PO e Nano Pool, embora existam outras alternativas.
mauricioadl
GUJ Master
[Avatar]

Membro desde: 10/05/2007 14:52:21
Mensagens: 1140
Offline

Tchello wrote:
mauricioadl wrote:O problema continua prq vc abre a conexao em todos os selects;

seu codigo precisa de algumas correções.

1º use um fabrica de conexoes, procure aqui no forum que deve ter um monte de coisa a respeito
2º faça com que sua conexão seja um singleton e a mantenha aberta durante o uso da aplicacao, eh menos custoso do que abrir e fechar
3º nunca use statement troque por preparedStatement eh melhor e mais seguro


O uso de singletons deve ser feito somente com supervisão de um adulto. Evite-os a todo custo, a grande maioria esmagadora da utilização de Singletons é desnecessária tanto que esse se tornou um anti-padrão documentado (embora esteja como um padrão de projetos no livro do GoF).

Não mantenha uma conexão aberta durante a vida toda da aplicação, no final das contas essa será encerrada pelo próprio SGBD e você morrerá com uma exception ao tentar usa-la.
Isso sem contar que estará guardando um recurso desnecessariamente, aumento o custo computacional da aplicação.

O correto é abrir uma conexão por transação necessária e encerra-la tão logo a transação finalize.
Seria de bom tom (e mais inteligente) o uso de um pool de conexões, deixando que esse gerencie as conexões, cabendo a você pedi-las e devolve-las no inicio e fim das transações respectivamente, ficando transparente a quem a usa detalhes como usuário e senha do banco (algo semelhante a factory de conexões).

Existem dezenas de pools por ai, de uma olhada no C3PO e Nano Pool, embora existam outras alternativas.


concordo com vc em algumas coisas e outras nao Eh muito comum ver muita gente falando para fechar as conexoes ao terminar de usar, fazer isso numa base oracle vai ter um sistema mais lendo que o windows 98 rodando num 386. Manter a conexao aberta eh muito leve comparado ao abrir e fechar principalemente em um sistema q manipula dados constantemente.
isso eh minha opniao eh claro!

Seu problema foi resolvido? Por favor, edite seu primeiro post e adicione [RESOLVIDO] no título.
O forum agradece.
[Email] [MSN]
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20580
Localização: Curitiba/PR
Offline

Faço minhas as palavras do Tchello.

Manter uma conexão aberta é fria por vários motivos:
1. Você fica ocupando o recurso no banco, sem usa-lo. Isso limita drasticamente o número de usuários simultâneos em sua aplicação;
2. Conexões simultâneas podem ser necessárias para processamento concorrente;
3. A solução que o Tchello apontou gerencia automaticamente a abertura/fechamento das conexões, evitando o problema de performance que você mencionou, e o erro que conexão fechada que o Tchello mencionou;
4. É uma boa prática de programação manter os recursos fechados, no finally, como recomenda o próprio criador da linguagem java: http://www.ibm.com/developerworks/java/library/j-jtp03216/index.html
5. É ridiculamente fácil usar o C3P0 ou o DBCP.
6. Frameworks de persistência, como o Hibernate e Spring também trabalham com conexões fechadas.

Mauricio, informe-se sobre os pools de conexão e você vai ver que rodam bem até mesmo no Oracle, com a conexão devidamente fechada.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Tchello
GUJ Master
[Avatar]

Membro desde: 07/06/2008 14:41:04
Mensagens: 1695
Offline

mauricioadl wrote:
concordo com vc em algumas coisas e outras nao Eh muito comum ver muita gente falando para fechar as conexoes ao terminar de usar, fazer isso numa base oracle vai ter um sistema mais lendo que o windows 98 rodando num 386. Manter a conexao aberta eh muito leve comparado ao abrir e fechar principalemente em um sistema q manipula dados constantemente.
isso eh minha opniao eh claro!


O que quero dizer vai além da opinião pessoal, mas vai de bom senso seguindo boas práticas que só a experiência te mostra.
Se em uma entrevista alguém me disser essa estratégia de manter uma conexão aberta com certeza isso pesará muito para que eu não contrate o sujeito.

E outra, sugiro veementemente que estude a respeito de pool de conexões.
mauricioadl
GUJ Master
[Avatar]

Membro desde: 10/05/2007 14:52:21
Mensagens: 1140
Offline

Vini, eh impossivel discutir algo com vc, prq vc eh um dos maiores javeiros do brasil e tem meu eterno respeito.
se eu nunca te agradeci, obrigado! vc me ajudou muito varias e varias vezes.


Trabalhar com as regras de negocio dentro do oracle usando pl sql fica impossivel usar frameworks, pois quase 90% das chamadas sao procedures.
Todas as chamadas simultaneas caem na mesma servlet, entao uma unica conexao eh necessaria, ja que o oracle da um lock nas outras qndo vai fazer a tarefa.
Tentamos por muito tempo fazer varias tecnicas para fechar, pool, fabrica, etc mas todas perdiam desempenho.
o oracle demora 5s exatos para abrir a conexao, imagine um ERP fazendo de 1000 a 2000 chamadas por hora, fica tenso o negocio
Como vivenciei isso por bastante tempo, acredito veementemente que mante-la aberte eh uma boa solução, pelo menos no meu caso.
eh claro que se vc tem um blog q usa o banco so pra gravar o e-mail vc nao vai fazer isso e nem usar um banco do tamanho do oracle, bom senso eh tudo.

[]'s

Seu problema foi resolvido? Por favor, edite seu primeiro post e adicione [RESOLVIDO] no título.
O forum agradece.
[Email] [MSN]
mauricioadl
GUJ Master
[Avatar]

Membro desde: 10/05/2007 14:52:21
Mensagens: 1140
Offline

Tchello wrote:
mauricioadl wrote:
concordo com vc em algumas coisas e outras nao Eh muito comum ver muita gente falando para fechar as conexoes ao terminar de usar, fazer isso numa base oracle vai ter um sistema mais lendo que o windows 98 rodando num 386. Manter a conexao aberta eh muito leve comparado ao abrir e fechar principalemente em um sistema q manipula dados constantemente.
isso eh minha opniao eh claro!


O que quero dizer vai além da opinião pessoal, mas vai de bom senso seguindo boas práticas que só a experiência te mostra.
Se em uma entrevista alguém me disser essa estratégia de manter uma conexão aberta com certeza isso pesará muito para que eu não contrate o sujeito.

E outra, sugiro veementemente que estude a respeito de pool de conexões.


se vc comecar a usar oracle vai descobrir q ele implementa um pool automaticamente.

vc pergunta sobre pool na entrevista? eh serio?

Seu problema foi resolvido? Por favor, edite seu primeiro post e adicione [RESOLVIDO] no título.
O forum agradece.
[Email] [MSN]
Tchello
GUJ Master
[Avatar]

Membro desde: 07/06/2008 14:41:04
Mensagens: 1695
Offline

mauricioadl wrote:
Tchello wrote:
mauricioadl wrote:
concordo com vc em algumas coisas e outras nao Eh muito comum ver muita gente falando para fechar as conexoes ao terminar de usar, fazer isso numa base oracle vai ter um sistema mais lendo que o windows 98 rodando num 386. Manter a conexao aberta eh muito leve comparado ao abrir e fechar principalemente em um sistema q manipula dados constantemente.
isso eh minha opniao eh claro!


O que quero dizer vai além da opinião pessoal, mas vai de bom senso seguindo boas práticas que só a experiência te mostra.
Se em uma entrevista alguém me disser essa estratégia de manter uma conexão aberta com certeza isso pesará muito para que eu não contrate o sujeito.

E outra, sugiro veementemente que estude a respeito de pool de conexões.


se vc comecar a usar oracle vai descobrir q ele implementa um pool automaticamente.

vc pergunta sobre pool na entrevista? eh serio?


First of all, 2000 mil requisições por hora não são nada. Reduza isso pelo menos por minuto, quiçá menos.

Que diferença faz qual SGBD se usa quando o que discutimos é um pool?
Se eu começar a usar Oracle? Isso só pode ter sido piada.
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team