Classe Conexão Oracle - O que acham?

8 respostas
gismo

Pessoal, fiz uma classe de conexão em oracle, queria saber o que vocês acham…

package backupss;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import javax.swing.JOptionPane;

public class ConexaoBanco {

    Connection conexao = null;

    /* Efetua conexão com o banco de dados */
    ConexaoBanco() throws SQLException {
        try
        {
            Class.forName("oracle.jdbc.driver.OracleDriver");
            String url = "jdbc:oracle:thin:@localhost:1521:banco";
            String username = "";
	    String password = "";
	    conexao = DriverManager.getConnection(url, username, password);
            JOptionPane.showMessageDialog(null, "Conexão efetuada com sucesso.");
        }
        catch(Exception e ) {
            JOptionPane.showMessageDialog(null, e);
        }
    }

    /* Retorna conexão quando é requisitada */
    public Connection getConnection() {
        return conexao;
    }
    
}

Minha idéia dela é chama-la no form principal e depois requisitar a conexão.

Será que posso melhorar em alguma coisa?

Obrigado.

8 Respostas

Tchello

Na verdade pode.
Esse é o primeiro passo, criar uma classe utilitária.
Depois disso você pode evoluir sua estratégia usando um pool de conexões (seja implementando um, por fins puramente de aprendizado) ou usando um que já exista, como o nano-pool ou o famoso e largamente utilizado C3PO.
Sugiro uma pesquisa e estudo sobre o seu funcionamento.

Hebert_Coelho

Ta legal. Só não esquece de fechar a conexão depois. [=

Eu já trabalhei com sistemas que apenas conectam ao banco para alguma tarefa e depois matam a conexão.

Eu achei até melhor um cadin pq aí c não passa aperto de memória no server.

Uma idéia, pq vc ao invés de passar a string na unha vc não passar por parametro no web.xml? Assim vc poderia configurar sua classe de conexão Oracle para genérica.

Aceitaria MySQL, SQLServer.

Parabéns pela iniciativa, pelo código bem identado e comentado somente onde precisava ser!

[=

gismo

Deixa eu vêr se eu entendi…

Toda vez que eu chamar minha classe (mesmo que seja só pelo getConnection) ele vai tentar se conectar com o banco de dados formando várias tentativas de conexões?

onizuka.class

Como o colega acima citou, você está no caminho certo. Para desenvolver um bom design de software
o ideal é você sempre se ligar nos padrões, isto é saber distribuir as responsabiblidades de cada classe,
assim também como definir bem suas estruturas diminuindo o acoplamento e por ai vai…

A sua classe está boa, no entanto, ficaria melhor você construir uma fábrica de conexão.
Dê uma olha no padrão Factory e veja suas vantagens. Outra dica é colocar os parâmetros de connexão
separados da classe, como um arquivo de propriedades ou um xml. Desta forma, quando você for migrar
de uma ambiente de desenvolvimento para produção não necessitará recompilar suas classes.

gismo

Obrigado a todos, realmente tem em muito o que melhorar…

:stuck_out_tongue:

laudenpower

Jogue os dados da conexão (usuário, url e senha) em um arquivo properties. Prefiro esse do que xml pois é mais fácil de alterar por conta da estrutura do arquivo (chave=“valor”), nesse caso também cabe perguntar se a sua aplicação é web ou desktop, por que se for desktop penso que é mais vantajoso usar uma conexão apenas para o aplicativo todo, fechando ela apenas na finalização do software, muitos dirão que isso consome recursos do banco de forma desnecessária (pois uma conexão pode ficar aberta sem ser usada durante um tempo) mas diminui o overhead na sua aplicação pois criar conexões é algo que não sai barato para o programa e com apenas uma conexão você não precisa se preocupar com pools de conexão (a menos que esteja em ambiente concorrido por que ai você corre risco de ter processos diferentes usando a mesma conexão podendo ocasionar deadlock). Se sua aplicação for web existem formas melhores de conseguir uma conexão e a melhor penso eu, é pegar um pool como um colega já disse, pois é mais tranquilo de controlar conexões sendo que nesse caso é interessante fechar todas as conexões sem exceção. No geral sua classe está boa :slight_smile:

Correção:
Pelo que vi sua classe utiliza um objeto do tipo JOptionPane sendo esse objeto do Swing nesse caso retorne apenas uma mensagem sem apresentar nesse objeto, pois não é interessante para não dizer boa prática colocar elementos da visão na camada de domínio.

Espero ter ajudado.

gismo

Refiz a classe mudando alguns conceitos e adicionei para pegar valores de um XML.

O que acharam?

package experimentosnetbeans;

import java.io.File;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.util.Iterator;
import java.util.List;
import javax.swing.JOptionPane;
import org.jdom.Document;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;

public class ConexaoBanco {

    Connection conexao = null;
    String url = null;
    String username = null;
    String password = null;

    /* Se a conexão for nula, tenta se conectar, caso contrário somente retorna a conexão  */
    public Connection getConnection() {
        if (conexao == null) {
            try {
                dadosXML();                
                conexao = DriverManager.getConnection(url, username, password);
                JOptionPane.showMessageDialog(null, "Conexão efetuada com sucesso.");
            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, e);
            }
        }
        return conexao;
    }

    /* Fecha conexão */
    public void closeConnection() {
        try {
            conexao.close();
            JOptionPane.showMessageDialog(null, "Conexão fechada com sucesso.");
        } catch (Exception e) {
            JOptionPane.showMessageDialog(null, e);
        }
    }

    private void dadosXML() throws ClassNotFoundException {
        File f = new File("DadosConexao.xml");

        SAXBuilder sb = new SAXBuilder();

        Document d = null;
        try {
            d = sb.build(f);
        } catch (JDOMException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }

        Element dadosConexao = d.getRootElement();
        List elements = dadosConexao.getChildren();
        Iterator i = elements.iterator();

        while (i.hasNext()) {
            Element element = (Element) i.next();
            Class.forName(element.getChildText("classe"));
            url = element.getChildText("url");
            username = element.getChildText("username");
            password = element.getChildText("password");
        }
    }
}

Só uma coisa que eu não consegui fazer…

Para pegar os valores do XML eu precisei fazer um List dos elementos, teria como eu pegar esses valores sem fazer um list? Ou seja, só utilizar o .getChildText() ?

Obrigado

nel

Boa tarde.

Não é por nada, mas não acha que está complicando um pouco mais do que deveria?
Utilize um arquivo com extensão properties, exemplo: conexao.properties.

A partir dai utiliza FileInputStream() ou outra classe do genero para ter acesso a este arquivo properties e em seguida extrair as informações.
Exemplo:

conexao.properties

url = ....
user = ....
password = ...

Ai depois de ter acesso via Input do arquivo, basta fazer...

Properties propertie = new Propertie();
         propertie.load(seuarquivo);

         String url = propertie.getProperty("url");

É por ai. Pode melhor e muito isso, deixa esta variavél como "global" em sua classe e verificar se ela é nula e somente se for você gera uma instância dela.
Está ai uma dica. Muito mais simples que com XML, pelo menos eu acho.

Abraços!

Criado 27 de julho de 2010
Ultima resposta 3 de ago. de 2010
Respostas 8
Participantes 6