[RESOLVIDO]Sobrecarga ao inserir dados em banco

14 respostas
wilsontads

Pessoal eu tenho o seguinte problema.. "copiar todos os dados de um banco, e fazer o backup em outro".
eu consegui fazer com algumas tabelas a migração de todos os registro, só que tenho uma que possui algo em torno de 60.000 registros, e a consulta abaixo só tá inserindo no banco de backup, apenas algo em cerca de 40...45 mil..
Não sei o que eu posso estar fazendo de errado, todas as conexões, são fechadas depois que rodo as instruções de cada uma.
Na tela do sistema eu seto pra desabilitar alguns botões, e habilita-los somente quando concluir, só que durante a execução, os botões são desabilitados, e a ferramenta fica com status de copiando e não consigo fazer mais nada..
alguém sabe o que eu posso fazer pra melhorar o desempenho ou copiar todos os registros?

import java.sql.PreparedStatement;
import java.sql.ResultSet;

    public void migraDados() throws Exception {
        Banco bancolocal = null;
        String sqlconsulta="";
        PreparedStatement ps = null;
        Banco bancobackup = null;
        ResultSet rs1 = null;
        String sqldelete="select nome, telefone, endereco from cliente";
        String sqlinsercao="inserto into cliente(nome,telefone,endereco) values(?,?,?)";
        Conexao conbancolocal = new Conexao(bancolocal);
        Conexao conbancobackup = new Conexao(bancobackup);
        conbancolocal.getConexao();//abre conexao local
        
        rs1 = conbancolocal.consulta(sqlconsulta);//busca todos os registros no banco
        //local
        conbancobackup.getConexao();//abre conexao backup
        conbancobackup.ExecuteUpdate("delete from cliente");//aqui deleta todos do 
        //banco de saida antes de inserir
        try{
        while (rs1.next()) {
            ps = null;
            ps = conbancobackup.getPreparedStatement(sqlinsercao);           
                try{   
                    ps.setString(1, rs1.getString("nome"));
                    ps.setString(2, rs1.getString("telefone"));
                    ps.setString(3, rs1.getString("endereco"));
                }catch(Exception ex){                    
                }
            }
            ps.execute();
        }
        conbancolocal.fecharConexao(conbancolocal);
        conbancobackup.fecharConexao(conbancobackup);
    }

14 Respostas

ViniGodoy

Jamais faça isso aqui:

}catch(Exception ex){ }

Pois você será incapaz de ver qualquer erro de conexão que possa ocorrer em seu banco.

Para esse tipo de operação, seria legal organizar batchUpdates.

wilsontads

Sim… eu removi algumas linhas, do código original, pra ficar mais legível aqui no fórum…

wilsontads

Mais não retorna erro nenhum… não gera nenhuma excessão… simplesmente, ele meio que da uma congelada no processo… =

ViniGodoy

Pode ser sobrecarga no banco.

wilsontads

Como? mais deve haver uma maneira em JSE de eu copiar todos…não há?

ViniGodoy

Sim, os batch updates que comentei.

wilsontads

A sim, desculpe… pensei que estava apenas corrigindo meu exception rs
você tem um exemplo de utilização deste?

wilsontads

O problema não ta na consulta… meu Rs, consegue trazer todos os dados…
o problema é na hora de inserir, que nao consigo entender o que acontece…

wilsontads

Um exemplo que eu vi aqui funciona +/-.
será que tem uma maneira de eu passar parâmetros?

con = DriverManager.getConnection(url, "myLogin", "myPassword"); stmt = con.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); con.setAutoCommit(false); stmt.addBatch("INSERT INTO COFFEES " + "VALUES('Amaretto', 49, 9.99, 0, 0)");

ViniGodoy

Tem sim:
http://www.java2s.com/Code/Java/Database-SQL-JDBC/PreparedStatementBatchUpdate.htm
http://www.java2s.com/Code/Java/Database-SQL-JDBC/DemoPreparedStatementAddBatchMySQL.htm

Só cuidado para não mandar batchs gigantes. O ideal é mandar de 50 em 50, ou 100 em 100, dependendo do seu banco.

wilsontads

Quando você disse que seria legal… quis dizer que resolveria meu problema?

ViniGodoy

Evidentemente que não. Até porque, não entendemos exatamente qual é o seu problema ainda, e só podemos chutar.
Quando disse que era legal, quis dizer que seria uma maneira mais eficiente de fazer a mesma coisa.

Em operações de batch desse tipo, o batchUpdate não só é bem mais rápido, como mais eficiente.
Se isso for mesmo uma sobrecarga, provavelmente o problema será resolvido.

wilsontads

Certo ^^
fiz as devidas alterações…to mandando de 100 em 100, agora vamos pro teste =D

wilsontads

Certinho cara… usei batchUpdates, e o sistema agora ta copiando todos os dados

Criado 13 de junho de 2011
Ultima resposta 14 de jun. de 2011
Respostas 14
Participantes 2