Java e postgres - duvida cruel

14 respostas
M

Tenho um sistema feito em java - swing que acessa o postgres.
Criei uma classe de conexao com o banco, uma de login e uma de edição dos dados (insert, delete, update), bem básico, apenas um simples exemplo.
O sistema inicia com o login, chamando a classe de conexao, e depois, chama a edição dos dados.

Nesta classe de edição, quando vou fazer um insert, delete ou update, tenho que NECESSARIAMENTE chamar novamente a classe de conexao com o banco ???
Por que ???
Se eu ja me conectei com o banco na tela de login, porque preciso me conectar de novo ???

14 Respostas

P

opa, na verdade o lance eh vc ter uma classe Facotry q “fabrique” as conexões com o banco…essa classe deve ser Singleton, exatamente para existir o reaproveitamento da instancia…

outra coisa, eh interessante configurar um pool de conexões, para q a aplicação nao tente re abrir conexões ja feitas, no pool vc tb vai configurar tempo de timeout, qtd de conexões, etc…

M

essa classe facotry ??? como deve ser ela …

a minha classe de conexao eh a seguinte

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

public class conexao {

	static Connection con = null;
	Statement stmt;
	
	public conexao(String usuario , String senha , String sistema){
		try {
			Class.forName("org.postgresql.Driver");
			String junto = "jdbc:postgresql://10.1.1.14:5432/" + sistema ;
			con = DriverManager.getConnection(junto,usuario,senha);
			stmt = con.createStatement();
			JOptionPane.showMessageDialog(null,"Conexão efetuada com sucesso !");
			new menu(usuario);
		}
		catch (Exception ee) {
			JOptionPane.showMessageDialog(null,"Não foi possível conectar ao banco de dados !\n" + ee.getMessage());
			ee.printStackTrace();
		}
	}
}

como eu configuro o pool ???

P

desculpe pelo erro de digitação, mas eh Factory, hehehehe

da uma olhada nesses tutoriais, vai te ajudar bastante http://www.portaljava.com/home/modules.php?name=Content&pa=list_pages_categories&cid=8

procure se informar sobre o Pattern “Singleton”…

baum, tente fazer algumas coisas aih conforme isso q eu te passei e vai postando suas duvidas…

flw

M

segue um exemplo de singleton que copiei do livro do deitel 4º edição :

public final class Singleton {
	
	private static Singleton singleton ;
	
	private Singleton() {
		System.err.println("teste 1");
	}
		
	public static Singleton getSingletonInstance() {
		if ( singleton == null ) singleton = new Singleton();
		return singleton;
	}
}
public final class SingletonExample {
	public static void main( String args[] ) {
		Singleton firstSingleton;
		Singleton secondSingleton;
		
		firstSingleton = Singleton.getSingletonInstance();
		secondSingleton = Singleton.getSingletonInstance();
		
		if ( firstSingleton == secondSingleton ) System.out.println("teste 2");
	}
}

como faco agora para colocar a minha classe de conexao com o postgres neste singleton ?

e como fazer a chamada desta nas minhas classes ??

G

“marcoscorso”:
segue um exemplo de singleton que copiei do livro do deitel 4º edição :

public final class Singleton {
	
	private static Singleton singleton ;
	
	private Singleton() {
		System.err.println("teste 1");
	}
		
	public static Singleton getSingletonInstance() {
		if ( singleton == null ) singleton = new Singleton();
		return singleton;
	}
}
public final class SingletonExample {
	public static void main( String args[] ) {
		Singleton firstSingleton;
		Singleton secondSingleton;
		
		firstSingleton = Singleton.getSingletonInstance();
		secondSingleton = Singleton.getSingletonInstance();
		
		if ( firstSingleton == secondSingleton ) System.out.println("teste 2");
	}
}

como faco agora para colocar a minha classe de conexao com o postgres neste singleton ?

e como fazer a chamada desta nas minhas classes ??

Cara,

Singleton, eh um Pattern, uma padrão de projeto, a idéia do Singleton é a mesma do HighLander: “Só pode haver um”.

Vc tem q adaptar sua classe para esse padrão, e não criar outra classe.

1)Crie um contrutor privado para sua classe, evitando q ela possa ser instanciada a vontade.

2)Implemente um método getInstance(), através dele será obtido o objeto desejado.

3)Mantenha uma referencia a um objeto da propria classe. Ex:

public class Teste {
	private Teste t;
	
	private Teste() {
		
	}
	
	
	public static Teste getInstance() {
		if ( t == null )
			t = new Teste();
		
		return t;
	}
}

A idéia é mais ou menos essa, dessa forma, vc sempre terá apenas uma instancia do Objeto teste, independente do local da aplicação.

Creio que seja isso, qualquer dúvida avise.

M

nao entendi muito o que vc comentou …

nao posso colocar essa minha classe de conexao num singleton ??
ou no singleton chamar essa classe de conexao …

como fazer ??

pode passar um exemplo …

G
"marcoscorso":
nao entendi muito o que vc comentou ...

nao posso colocar essa minha classe de conexao num singleton ??
ou no singleton chamar essa classe de conexao ...

como fazer ??

pode passar um exemplo ...

Marcos, acontece que você só deve fornecer uma instância de uma conexão com o banco de dados. Por isso foi recomendad a utilização do padrão de projeto Singleton que faz justamente isso.

Você tem que criar classe de conexão de forma que a mesma só forneça uma instância para as classes da aplicação.

Segue um exemplo de Singleton:

public class Singleton {

  private static final Singleton instance = new Singleton();
 
  private Singleton() {
  }

  public static Singleton getInstance() {
    if (instance == null) {
       return instance;
    }
    return null;
  }

}

Sempre que tiver dúvidas, faça uma pesquisa no fórum. Há milhares de dúvidas respondidas e quem sabe você encontra a sua ?

:wink:

M

e como chamar a classe de conexao neste singleton ???

ou como colocar a classe de conexao no singleton ???

nao entendi nada ate agora …

M

ainda nao entendi como fazer e usar esse singleton …

sera que alguem pode disponibilizar algum exemplo ja com a conexao pronta

obrigado

G
public final class Conexao {

    private Conexao() {
    }

    public static Connection getConexao()
    throws MissingResourceException, SQLException, NamingException, Exception {
        Connection conexao = null;
        Class.forName("org.postgresql.Driver").newInstance();
        conexao = DriverManager.getConnection("jdbc:postgresql://localhost:5432/banco", "user", "password");
        conexao.setAutoCommit(false);
        return conexao;
    }

}
M

ok, vou verificar aqui …

dae desta maneira ele ficara conectado direto com o banco de dados ou num “select” eu devo chamar novamente essa classe ???

e na saída do meu programa, devo fechar tambem essa conexao ???

M

adicionei apenas um import java.sql.*; no código acima, mas ta com erro, devo importar outra classe ?? qual ??

estou usando o eclipse 3.2 …

M

ainda nao consegui pessoal …

M

criei a seguinte classe :

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

public final class conexao2 { 

    private conexao2() { 
    } 

    public static Connection getconexao2() throws MissingResourceException, SQLException, NamingException, Exception {
    	Connection conexao = null;
    	Class.forName("org.postgresql.Driver").newInstance();
    	conexao = DriverManager.getConnection("jdbc:postgresql://10.1.1.14:5432/coren", "postgres", "teste");
    	conexao.setAutoCommit(false);
    	return conexao;
    } 

}

na hora de compilar pelo jcreator da o seguinte erro :

[b]

--------------------Configuration: j2sdk1.4.2_12 <Default>--------------------

C:\eclipse\workspace\coren\conexao2.java:10: cannot resolve symbol

symbol  : class MissingResourceException

location: class conexao2

public static Connection getconexao2() throws MissingResourceException, SQLException, NamingException, Exception {

^

C:\eclipse\workspace\coren\conexao2.java:10: cannot resolve symbol

symbol  : class NamingException

location: class conexao2

public static Connection getconexao2() throws MissingResourceException, SQLException, NamingException, Exception {

^

2 errors

Process completed.
[/b]

Criado 20 de dezembro de 2006
Ultima resposta 13 de mar. de 2007
Respostas 14
Participantes 4