É correto usar sempre a mesma conexão de JDBC em um programa?

Tenho a seguinte classe:

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */
    package testeTemplates.conexoes;

import java.sql.*;
import javax.swing.JOptionPane;
/**
*

  • @author adm
    */
    public class Conexao {
    public static String database = “jdbc:postgresql://localhost/testeFramework”;
    public static String usuario = “postgres”;
    public static String senha = “masterkey”;
    public static String driverName=“org.postgresql.Driver”;
    public static Connection conexao;
    public static Statement consulta;
    public static ResultSet resultado;

    public static void criarConexao(){
    try{
    Class.forName(driverName);
    conexao = DriverManager.getConnection(database,usuario,senha);
    consulta = conexao.createStatement();
    //resultado = consulta.executeQuery(“select * from cidades order by estado,cidade”);
    }catch(Exception e){JOptionPane.showMessageDialog(null, e.getLocalizedMessage());}
    }
    }[/code]
    Aonde eu executo este método criarConexao() apenas uma vez no inicio do programa, e cada vez que eu quero fazer um select eu faço direto chamando o resultSet da classe Conexao. Vocês acham que está certo fazer assim?

Ouvi falar que a conexão pode ser fechada pelo banco depois de um tempo, então pensei em fazer uma thread separada e nessa Thread a cada 20 minutos eu executaria de novo o metodo criarConexao, essa informação procede? e a minha solução é viavel pra evitar esse problema?

O melhor é usar um esquema de Connection Pool. Dá uma pesquisada no GUJ sobre isto que vc vai achar bastante referencias.

O ideal é você usar um pool de conexões para gerenciar isso pra você. Dê uma olhada no c3p0. Se não quiser usar o pool eu vejo 2 soluções viáveis: ou você abre uma única conexão no início da aplicação e trabalha com ele toda a vida ou cria uma conexão cada vez que você precisar.
O que você pode fazer é criar uma interface ConnectionFactory com o método getConnection(). Faça uma implementação simples que cria uma conexão toda vez que precisar. Caso queira otimizar isso depois, é só mudar a implementação da factory, você pode até mesmo trocar pelo pool depois.

Agora, o que você precisa separar é a classe de conexão da classe que vai manter os ResultSet’s e Statement’s. Na prática, é até mais importante fechar ResullSet’s e Statement’s do que conexões, pois eles mantém cursores abertos no banco. No seu caso, eu vejo que você quer buscar informações de cidades. Nesse caso, você precisaria de uma classe para abrir conexões e um DAO para Cidades, com os Statements necessários para buscar as cidades. Você pode ainda, manter a lista das cidades em memória, já que é o tipo de informação que não muda com tanta frequencia.

Antes eu tava fazendo assim, pra cada select que eu fazia eu criava uma conexão nova e depois de fazer o select eu fechava tudo, connection, statement, e resultset.
Eu resolvi fazer desse método novo pois diziam que ficava mais lento fazer varias conexões do que fazer uma conexão unica no inicio do programa.

[quote=mateusviccari]Antes eu tava fazendo assim, pra cada select que eu fazia eu criava uma conexão nova e depois de fazer o select eu fechava tudo, connection, statement, e resultset.
Eu resolvi fazer desse método novo pois diziam que ficava mais lento fazer varias conexões do que fazer uma conexão unica no inicio do programa.[/quote]

Sim, porém você tem que separar a criação da conexão da execução das queries.

O c3p0 oferece um pool de excelente qualidade:

http://www.mchange.com/projects/c3p0/index.html

Tópico movido para o fórum de persistência.

Outra ótima opção, além do C3P0 é o Jakarta DBCP.