ConnectionFactory JDBC - Boas idéias para melhorar a classe

5 respostas
Bruno_M_Gasparotto

Boa tarde senhores!

Em um de meus projetos, tenho uma classe ConnectionFactory com apenas um método, o getConnection().

Meu banco de dados possui umas 10 base de dados (schemas) diferentes, portanto, as vezes será preciso eu alterar a URL que a classe utilizará para criar a conexão, pois será utilizado um banco de dados diferente. Além disso, o usuário pode acessar simultaneamente, schemas diferentes, ou seja, teria que ter duas ou mais conexões abertas e diferentes ao mesmo tempo.

Para fazer isso, qual seria uma boa prática de implementação?
[list]Alterar meu método getConnection para getConnection(String URL)[/list]
[list]Implementar um método setDatabase(String URL) e após isso, chamar o getConnection normalmente[/list]
[list]Outro?[/list]

Outra coisa importante, quanto ao usuário e senha, o melhor seria eu informar isso enviando um argumento? Daí seria algo como getConnection(String URL, String user, String password).

Abaixo minha classe de conexão, na verdade eu já sei como implementar de modo que atenda as minhas necessidades, porém não sei se isso será fazer gambiarra, por isso a dúvida, pois todo lugar que vejo, o método getConnection() de uma ConnectionFactory não recebe parâmetros.

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;

public class ConnectionFactory {
	public static java.sql.Connection getConnection() {
        Connection connection = null;

        try {
            /* Obtém o driver de conexão com o banco de dados */
            Class.forName("com.mysql.jdbc.Driver");

            /* Configura os parâmetros da conexão */
            String url = "jdbc:mysql:ip:porta/schema";
            String username = usuario; 
            String password = senha;
            
            /* Tenta se conectar */
            connection = DriverManager.getConnection(url, username, password);

            /* Caso a conexão ocorra com sucesso, a conexão é retornada */
            return connection;
            
        } catch (ClassNotFoundException e) {            
            System.out.println("O driver expecificado nao foi encontrado.");
            return null;
            
        } catch (SQLException e) {
            System.out.println("Nao foi possivel conectar ao banco de dados.");
            return null;
        }
    }
}

5 Respostas

drsmachado

Projeto desktop ou web?
Se web, use um data source, todo container/application server possui suporte.
Se desktop é mais complicado, pois determinados dados não devem ser acessíveis ao desenvolvedor, como as informações de acesso ao banco, por exemplo.

Bruno_M_Gasparotto

drsmachado:
Projeto desktop ou web?
Se web, use um data source, todo container/application server possui suporte.
Se desktop é mais complicado, pois determinados dados não devem ser acessíveis ao desenvolvedor, como as informações de acesso ao banco, por exemplo.

É desktop. Eu pensei em armazenar o login e senha que ele digita em algum objeto do acervo e reaproveitar esses dados para passar a ConnectionFactory, daí eu não teria acesso aos dados do usuário, seria mais ou menos isso?

DaniloAndrade

uma ideia

enum Schema{
    	DATA_BASE1("jdbc:mysql:ip:porta/schema1","root",""), // uma linha pra cada Schema do Banco de dados
    	DATA_BASE2("jdbc:mysql:ip:porta/schema2","root","");
    	
    	private String url;
		private String usuario;
		private String senha;

		Schema(String url,String usuario, String senha){
			this.url = url;
			this.usuario = usuario;
			this.senha = senha;
    		
    	}
		
		public String getSenha() {
			return senha;
		}
		
		public String getUrl() {
			return url;
		}
		
		public String getUsuario() {
			return usuario;
		}
    }

e no metodo getConnectionFactory

public static java.sql.Connection getConnection(Schema schema) {  
    	Connection connection = null;  
    	
    	try {  
    		/* Obtém o driver de conexão com o banco de dados */  
    		Class.forName("com.mysql.jdbc.Driver");  
    		
    		/* Configura os parâmetros da conexão */  
    		String url = schema.getUrl();  
    		String username = schema.getUsuario();   
    		String password = schema.getSenha();  
    		
    		/* Tenta se conectar */  
    		connection = DriverManager.getConnection(url, username, password);  
    		
    		/* Caso a conexão ocorra com sucesso, a conexão é retornada */  
    		return connection;  
    		
    	} catch (ClassNotFoundException e) {              
    		System.out.println("O driver expecificado nao foi encontrado.");  
    		return null;  
    		
    	} catch (SQLException e) {  
    		System.out.println("Nao foi possivel conectar ao banco de dados.");  
    		return null;  
    	}  
    }

na chamada do metodo ficaria assim

Connection con = ConnectionFactory.getConnection(Schema.DATA_BASE1);
Bruno_M_Gasparotto

Gostei da sugestão Danilo, a chamada de método passando como parâmetro é algo que eu imaginava, mas não utilizando enum, pois faz sentido, não terá como ninguem usar a classe e passar um database que não exista.

Mas antes de implementar preciso dar uma revisada nas enumerações, li sobre elas apenas em um apêndice do Head First Java =D

Enfim, então parece que é normal sobrecarregar um método getConnection(), eu imaginava que fosse uma má prática por isso fiquei com o “pé atraz” de criar, aprender programar sozinho (digo, único programador da equipe) realmente ta sendo trabalhoso, mas divertido =).

Obrigado e grande abraço!

DaniloAndrade

não posso dizer que é a melhor solução, mas pro seu problema especifico pode ser usado… mas concordo tambem com o @drsmachado disse, o ideial é que essas configurações de banco fiquem fora da aplicação, em properties por exemplo onde vc poderia ter configurações especificas pra ambiente de desenv, homologação e produção

mas tudo depende do contexto

Criado 5 de fevereiro de 2013
Ultima resposta 6 de fev. de 2013
Respostas 5
Participantes 3