Connection

4 respostas
J

Galera, como eu implemento o padrão Singleton com banco de dados ?

Eu tinha pensando em fazer assim:

public class ConexaoBanco implements java.sql.Connection {
    
    private static java.sql.Connection unicaInstancia = null;
        
    /** Creates a new instance of ConexaoBanco */
    public ConexaoBanco() {}
    
    public static ConexaoBanco getInstance()
    {
        if (unicaInstancia = null)
        {
            //CARREGA O DRIVE
            Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

            //CRIA A CONEXAO
            unicaInstancia = DriverManager.getConnection("jdbc:odbc:Mercado");
            
        }
                
        return unicaInstancia;
        
    }
       
}

Porém ... como é que eu prover implementação para os métodos da interface Connection ? Não sei se estou falando besteira .... se ao menos Connection fosse uma classe abstrata com os métodos já implementados ...

4 Respostas

Rafael_Steil

Mas porque voce esta implementando Connection? Nao ha necessidade.
De qualquer maneira, funciona assim:

Voce tem uma interface definida. Entao, para que algo de util possa ser feito, alguma classe no sistema deve implementar a interface e definir o corpo dos metodos. Entao eh atraves desta classe que os objetos serao encontrados. Por exemplo:

interface MinhaInterface {
    public void meuMetodo();
}

ate aqui voce nao tem nada de concreto, eh necessario alguma classe para definir o corpo do metodo:

class MinhaClasse implements MinhaInterface {
    public void meuMetodo() {
        // blablabla
    }

Agora existem duas possibiliades: criar diretamente um objeto “MinhaClasse”, ou passar uma referencia
para um “MinhaInterface”. A vantagem de usar “MinhaInterface” eh que voce pode usar ela com todos os outros objetos
que tambem implementam tal interface.

MinhaInterface i = new MinhaClasse();
i.meuMetodo();

Neste caso, “i” pode ser usado com qualquer objeto que tenha implementado “MinhaInterface”. Agora, se
voce fizer

MinhaClasse c = new MinhaClasse();

somente podera usar com objetos do tipo “MinhaClasse”.

Eh desta mesma maneira que funciona com a interface “Connection”. O metodo “getConnection()” retorna
uma referencia para um objeto concreto que implementa “Connection”, por isso que ao usar os metodos
“createStatement” e outros, tudo funciona perfeitamente.

No teu caso, parece que voec quer implementar um Singleton mas nao sabe muito bem como aplicar. Antes
de mais anda, voce precisa decidir o que quer que soh tenha uma instancia em memoria. Ter um unico
objeto Connection, apesar de ser possivel fazer, eh meio estranho. Geralmente usa-se o Singleton
para retornar a referencia para o objeto da classe, e nao para um membro da mesma.

Rafael

J

Rafael eu entendi sua explicação sobre interfaces, polimorfismo … agora qto ao padrão Singleton …

Eu quero criar um conexao com meu banco de dados em uma aplicação cliente-server com Swing … criar o objeto Connection toda vez vai causar lentidão … então eu penso em abrir a conexao em um JFrame (MDI) e depois disponibilizar a referencia para todos … nao seria o caso de usar o padrão Singleton ? Como eu faria isso com Singleton ?

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


/**
 * @author William Jammes de Oliveira
 * @version 1.0
 *
 * Modulo: Gerenciador do Banco de Dados
 * Data: 20/11/2002
 * Alteração:
 */

public class Database {

	private static Connection conn = null;
	private static Database db = null;

	private  Database(String Host,String Db,String User,String Pass) {

		try {
			Class.forName("org.gjt.mm.mysql.Driver");

		} catch (ClassNotFoundException e) {
			JOptionPane.showMessageDialog(null,e.toString());
			System.exit(1);
		}

		try {
			conn = DriverManager.getConnection("jdbc:mysql://" + Host + "/" + Db + "?user=" + User + "&password=" + Pass  );
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,e.toString());
			System.exit(1);
		}
	}

	//Retorna uma instancia de DB
   public static Database getDataBase() {
      if (db == null) {
          db = new Database("localhost", "sicla", "root", "4991rs97");
      }
      return db;
   }
   
   public Connection  getConnection() throws SQLException {

   	return conn;

   }

   public Statement getStatement() throws SQLException {


	return conn.createStatement();

   }

   public PreparedStatement getPreparedStatement(String SQL) throws SQLException {

   	return conn.prepareStatement(SQL);

   }


   public void close() throws SQLException {
   	 conn.close();
   }

   public void finalize(){
		try {
			conn.close();
		} catch (SQLException e) {
			JOptionPane.showMessageDialog(null,e.toString());
			System.exit(1);
   }

  }
}

Pode fazer mais ou menos assim eu faço desse modo, não gosot de retornar conexões prefeiro criar funções pra retornar Statements e PreparedStatements blz …

Espero ter ajudado.

PRA QUE JANELA JANELAS SE POSSO VIVER SEM PAREDES !!!
SEJA LIVRE USE LINUX !!!
:wink:

J

Certo … valeu …

Criado 9 de janeiro de 2003
Ultima resposta 9 de jan. de 2003
Respostas 4
Participantes 3