[ Resolvido ]Select de um banco e insert em outro

Galera bom dia.
Estou com o seguinte dilema:
Tenho uma aplicação que conecta no SqlServer faz um select em uma tabela e depois conecta no FireBird pra fazer os insert’s.
Até aqui tudo bem usei o padrão de projeto Factory então sem problema de conexão, conecto no banco que preciso na hora que preciso.
Mais o X da questão é o seguinte:
Quando conecto no sqlserver faço o select cerca de 30mil linhas guardo tudo em um ResultSet isso leva menos de meio segundo ,esta dentro do esperado pela chefia, mais na hora de inserir este registro no firebird dependendo da maquina que esta instalado leva no minimo 6 minutos e chega até terriveis 40 minutos.
A chefia quase infarta com o tempo de insert, rsrs.
Alguém pode me dar uma solução pra estes insert, insert em lote,ou pegar os ResultSet e gravar de uma so vez, detalhe não estou usando framework.
Resumindo pegar o meu resultset que foi carregado em um select e dar um insert de todo resultset de uma so vez.

ricardo da comunidade “Karate - Arte e Filosofia”??

???

Alguma solução ?

Você está fazendo seus inserts em batch, ou é insert/commit?

Estou fazendo em insert, este é o metodo:

public int insertTableVDATEMP(ResultSet rs){
String sql = null;
int total =0;
try {
conexao.mudarConexao(new HrCarga());
} catch (FileNotFoundException e1) {
} catch (IOException e1) {

}	
sql="insert into VDATEMP (tributacao,cod_lido,qtde,descricao,preco) values(?,?,?,?,?)";
	
try {		
	Connection conn=conexao.getConnection();
	PreparedStatement ps = conn.prepareStatement(sql);			
	ps.setString(1, rs.getString(1));
	ps.setString(2,rs.getString(5));
	ps.setString(3,rs.getString(2));
	ps.setString(4,rs.getString(4));
	ps.setString(5,rs.getString(3));			
	ps.execute();
	total +=1;
	
} catch (SQLException e) {
	System.out.println(e.getMessage());
}	
return total;

}
e uso assim:

try {
while(rs.next()){
produto.insertTableVDATEMP(rs);

Tente usar o insert em batch do Java:

http://www.exampledepot.com/egs/java.sql/BatchUpdate.html

[quote=ricardo batista almeida] Estou fazendo em insert, este é o metodo:

public int insertTableVDATEMP(ResultSet rs){
String sql = null;
int total =0;
try {
conexao.mudarConexao(new HrCarga());
} catch (FileNotFoundException e1) {
} catch (IOException e1) {

}	
sql="insert into VDATEMP (tributacao,cod_lido,qtde,descricao,preco) values(?,?,?,?,?)";
	
try {		
	Connection conn=conexao.getConnection();
	PreparedStatement ps = conn.prepareStatement(sql);			
	ps.setString(1, rs.getString(1));
	ps.setString(2,rs.getString(5));
	ps.setString(3,rs.getString(2));
	ps.setString(4,rs.getString(4));
	ps.setString(5,rs.getString(3));			
	ps.execute();
	total +=1;
	
} catch (SQLException e) {
	System.out.println(e.getMessage());
}	
return total;

}
e uso assim:

try {
while(rs.next()){
produto.insertTableVDATEMP(rs);

[/quote]

Olá, utilize o bacth.

public boolean fazerONegocioFuncionar(ResultSet rs) throws SQLException, ClassNotFoundException {
		PreparedStatement pst = null;
		Connection con = null;
		int contador = 0;
		
		try {
			con = Conexao.getConexao();
			con.setAutoCommit(false);
			pst = con.prepareStatement("insert into tabela(campo, campo1, campon");
			
			while (rs.next()) {
				pst.setString(1, rs.getString(1));
		                pst.setString(2,rs.getString(5));
		                pst.setString(3,rs.getString(2));
		                pst.setString(4,rs.getString(4));
		                pst.setString(5,rs.getString(3));
				pst.addBatch();
				ncm = null;
				
				if ((++contador % 1000) == 0) {
					pst.executeBatch();
				}
			}
			pst.executeBatch();
			
			con.commit();
			return true;
		} catch (SQLException e) {
			con.rollback();
			destroyConnection();
			throw e;
		} finally {
			if (!pst.isClosed()) {
				pst.close();
			}
			
			pst = null;
			
			con = null;
		}
	}

Teste aqui mais não seria isso, o que eu queria era inserir tudo de uma so vez.
Se em menos de meio segundo eu jogo toda minha consulta pra dentro do ResultSet por eu não posso pegar todo ResultSet e jogar de uma só vez no banco

Não teria uma outra forma ,talvez carregar todos os dados em uma lista list talvez ou arraylist e pegar esta lista e inserir de uma vez no outro banco ?
Alguém se habilita a uma solução ?

[quote=ricardo batista almeida] Não teria uma outra forma ,talvez carregar todos os dados em uma lista list talvez ou arraylist e pegar esta lista e inserir de uma vez no outro banco ?
Alguém se habilita a uma solução ?[/quote]

Olá, mas o batch faz exatamente o que vc quer que faça, só coloquei aquela verificação de 1000 em 1000 para exemplificar, mas vc pode tirar do seu codigo.

Acho que não expliquei bem o senario:
Conecto no SqlServer 2005 depois um select na tabela PRECO e tudo fica dentro de um ResultSet.
Depois conecto no FireBird pego o objeto ResultSet da conexão anterior e do insert no Firebird, na hora do insert e feito linha a linha, aqui esta a lentidão.
A pergunta é se eu carrego de uma so vez o ResultSet como eu não posso gravar de uma so vez ?
Tenho que usar assim
While(rs.next){
executa o metodo de insert
}

Alguém tem alguma solução , Hibernate faz isso ?
Ou toda a minha base de dados ser gerado xml e pegar este xml e jogar no banco, sabendo que os bancos estão na rede em local fisico diferente.

o batch faz isso, grava tudo de uma so vez.

Não usei ResultSet e sim CacheRowSet , trata-se de um objeto desconectado ,então apos fazer o select no SqlServer desconecto , populo o CacheRowSet com ResultSet itero pelo CacheRowSet conectado no firebird (usei padrão de projeto Factory para as conexões com os bancos diferentes ) e vou gravando no firebird.
Que precisar do codigo pede ai.
Valeu galera.