[RESOLVIDO]Conectar com 2 bancos PostgreSql usando Connection Factory

Salve salve pessoal!

Tenho uma classe que pega as informações vinda de um formulário e as insere em um bd PostgreSql, ela está funcionando corretamente.

Agora na mesma classe preciso pegar parte dessas informações e inserir em um outro servidor (bd), mas não estou conseguindo fazer a conexão com este segundo bd.

Estou usando Spring MVC, e pra fazer a conexão estou usando Connection Factory.

Como faço pra abrir a segunda conexão no construtor?

Seguem meus códigos:

ConnectionFactory.java

[code]
public class ConnectionFactory2 {

public Connection getConnection2() throws SQLException {
	try {
		Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
		
	} catch (ClassNotFoundException e) {
		throw new SQLException(e);
	}
	System.out.println("abriu a conexão com banco");
	return DriverManager.getConnection("jdbc:postgresql://localhost:5432/press2" ,"teste", "teste");//PostgreSql
}

}[/code]

Método da Classe DAO

public class PlanoAcaoDAO extends PlanoAcao {
		private final Connection connection;
		
	public PlanoAcaoDAO() {
		try {
			this.connection = new ConnectionFactory2().getConnection2();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

	public void InsereAcao(PlanoAcao planoAcao, HttpSession session){
		
		int idPlano = 0;
		Util util = new Util();
		
		String sqlInsere = "insert into plano_acao(planta,data,rua,objeto,usuario,e_mail_usuario,problema,causa,acao,prazo,indicador,estatus,observacoes) " +
				"values (?,?,?,?,?,?,?,?,?,?,?,?,?) returning id_plano_acao";
		try {
			PreparedStatement stmt = this.connection.prepareStatement(sqlInsere);
			
			stmt.setString(1, planoAcao.getPlanta());
			
			java.sql.Date dataParaGravar = new java.sql.Date(planoAcao.getDataAbertura().getTimeInMillis());
			stmt.setDate(2, dataParaGravar);
			stmt.setString(3, planoAcao.getRua());
			stmt.setString(4, util.removeAcentos(planoAcao.getObjeto()));
			stmt.setString(5, planoAcao.getUsuario());
			stmt.setString(6, planoAcao.getEmailUsuario());
			stmt.setString(7, util.removeAcentos(planoAcao.getProblema()));
			stmt.setString(8, util.removeAcentos(planoAcao.getCausa()));
			stmt.setString(9, util.removeAcentos(planoAcao.getAcao()));
			stmt.setInt(10, planoAcao.getPrazo());
			stmt.setString(11, planoAcao.getIndicador());
			stmt.setInt(12, planoAcao.getEstatus());
			stmt.setString(13, planoAcao.getObservacoes());
						
			ResultSet rs = stmt.executeQuery();
			
			if (rs.next()) {				
				idPlano = rs.getInt("id_plano_acao");
			}
			rs.close();
			stmt.close();
			
			
			//Pega o ID de retorno do plano de ação e insere os responsáveis 
			String resp[] = planoAcao.getResponsavel().split(",");
			
			for (int i = 0; i < resp.length; i++) {
				
				String insereResponsaveis = "insert into plano_acao_responsaveis (id_plano_acao, id_responsavel) values("+idPlano+","+resp[i]+")";
				PreparedStatement stmt2 = this.connection.prepareStatement(insereResponsaveis);
				
				stmt2.execute();
				stmt2.close();
			}
			
			//Aqui vou colocar a função que vai gravar as informações no 2º BD
			//#GRAVA AS INFORMAÇÕES NO SEGUNDO BD!!!!!
		
		} catch (SQLException e) {
			throw new RuntimeException("ERRO:"+e);
		}
		

	}	

Abraços!

Não sei se tem alguam diferença em Spring mas vc pode criar um método getConnection() com um parâmetro para verificar qual conexão vc quer, esse método chamará outro com os dados da conexão solicitada, aí na sua classe de persistência vc escolhe qdo chamar um ou outro banco, ex:

public class ConnectionFactory {
    public Connection getConnection() throws SQLException {
        swtch (opcao)
            case 1:
                return getConnectionB1();
            case 2:
                return getConnectionB2();
    }

    public Connection getConnectionB1() throws SQLException {  
        // dados para conexão com o primeiro banco
    }  

    public Connection getConnectionB2() throws SQLException {  
        // dados para conexão com o segundo banco
    }
}

No código q vc postou vejo duas opções, ou vc cria uma segunda variável Connection e atribui a segunda conexão à ela (acho pouco viável visto q vc ficará com duas conexões sempre q instanciar a classe) ou vc faz a conexão dentro do método q for utilizar a mesma (InsereAcao por exemplo), nesse caso vc pode desconectar de um banco e conectar em outro.

Aff… como diria o professor Neri que barbada !

Eu estava no caminha certo, mas como eu não tinha completado a escrita estava acusando erro no construtor e eu já parava.

Segue minha solução:

public class PlanoAcaoDAO extends PlanoAcao {
		private final Connection connection;
		private final Connection connection2;
		
	public PlanoAcaoDAO() {
		try {
			this.connection = new ConnectionFactory2().getConnection2();
			this.connection2 = new ConnectionFactoryMail().getConnectionMail();
		} catch (SQLException e) {
			throw new RuntimeException(e);
		}
	}

[quote=fabiocortolan]Não sei se tem alguam diferença em Spring mas vc pode criar um método getConnection() com um parâmetro para verificar qual conexão vc quer, esse método chamará outro com os dados da conexão solicitada, aí na sua classe de persistência vc escolhe qdo chamar um ou outro banco, ex:

public class ConnectionFactory {
    public Connection getConnection() throws SQLException {
        swtch (opcao)
            case 1:
                return getConnectionB1();
            case 2:
                return getConnectionB2();
    }

    public Connection getConnectionB1() throws SQLException {  
        // dados para conexão com o primeiro banco
    }  

    public Connection getConnectionB2() throws SQLException {  
        // dados para conexão com o segundo banco
    }
}

No código q vc postou vejo duas opções, ou vc cria uma segunda variável Connection e atribui a segunda conexão à ela (acho pouco viável visto q vc ficará com duas conexões sempre q instanciar a classe) ou vc faz a conexão dentro do método q for utilizar a mesma (InsereAcao por exemplo), nesse caso vc pode desconectar de um banco e conectar em outro.[/quote]

Cara, é uma ótima sugestão, vou fazer uns testes também.

Valeu!