| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 14:34:55
|
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.
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 14:36:49
|
mauricioadl
GUJ Master
![[Avatar]](/images/avatar/0958560bd45062d115debadb6bca3183.png)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 14:37:09
|
lemosxd01
What is classpath?
![[Avatar]](/images/avatar/c24739f6e42a682917b12cd10ac66c0d.jpg)
Membro desde: 17/06/2011 19:15:21
Mensagens: 7
Offline
|
posta ai teu codigo parceiro
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 14:40:27
|
rafaduka
JavaGuru
![[Avatar]](/images/avatar/8fb49549f3fd57ad0a80e57825f9e41e.jpg)
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" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 14:52:25
|
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:
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 14:57:39
|
rafaduka
JavaGuru
![[Avatar]](/images/avatar/8fb49549f3fd57ad0a80e57825f9e41e.jpg)
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" |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 14:58:15
|
mauricioadl
GUJ Master
![[Avatar]](/images/avatar/0958560bd45062d115debadb6bca3183.png)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 03/01/2012 15:27:17
|
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...
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2012 12:45:17
|
Tchello
GUJ Master
![[Avatar]](/images/avatar/901db33c84e81b1a30e59949bbcb112b.png)
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2012 16:46:32
|
mauricioadl
GUJ Master
![[Avatar]](/images/avatar/0958560bd45062d115debadb6bca3183.png)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 04/01/2012 19:34:15
|
ViniGodoy
Moderador
![[Avatar]](/images/avatar/1921493b5362e63fbe8983f4bd54157d.png)
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 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/01/2012 06:29:45
|
Tchello
GUJ Master
![[Avatar]](/images/avatar/901db33c84e81b1a30e59949bbcb112b.png)
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.
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/01/2012 06:42:16
|
mauricioadl
GUJ Master
![[Avatar]](/images/avatar/0958560bd45062d115debadb6bca3183.png)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/01/2012 06:50:59
|
mauricioadl
GUJ Master
![[Avatar]](/images/avatar/0958560bd45062d115debadb6bca3183.png)
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. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 05/01/2012 07:24:11
|
Tchello
GUJ Master
![[Avatar]](/images/avatar/901db33c84e81b1a30e59949bbcb112b.png)
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.
|
|
|
 |
|
|