Java e postgres - duvida cruel

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 ???

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…

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 ???

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

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 ??

[quote=“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 ??[/quote]

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.

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 …

[quote=“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 …[/quote]

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:

[code]public class Singleton {

private static final Singleton instance = new Singleton();

private Singleton() {
}

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

}[/code]

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:

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

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

nao entendi nada ate agora …

ainda nao entendi como fazer e usar esse singleton …

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

obrigado

[code]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;
}

}[/code]

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 ???

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 …

ainda nao consegui pessoal …

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]