Dúvida com inserções em batch no MySQL

0 respostas
Dieval_Guizelini

Senhores,

desenvolvi um procedimento bem simples para ler um arquivo texto e inserir linha a linha em uma tabela do MySQL, vejam o comando de criação da tabela:
create table tabela1 (
id int not null primary key,
linha varchar(255) not null
) type=myisam;

create table tabela2 (
id int not null auto_increment primary key,
linha varchar(255) not null
) type=myisam;
E o código em Java:
public static void main(String[] args) {
        File arq = new File("NC_003070.gbk");
        process1(arq);
        process2(arq);
        process3(arq);
    }

    public static void process1(File arq) {
        java.io.BufferedReader in = null;
        java.sql.Connection con = null;
        java.sql.PreparedStatement ps = null;
        try {
            con = getConn();
            ps = con.prepareStatement("insert into tabela1 (id,linha) values (?,?)");
            int contador = 1;
            in = new java.io.BufferedReader(new java.io.FileReader(arq), 32768);
            long t0 = System.currentTimeMillis();
            String linha = null;
            while ((linha = in.readLine()) != null) {
                ps.setInt(1, contador++);
                ps.setString(2, linha);
                ps.executeUpdate();
                if (contador % 50000 == 0) {
                    System.out.print(".");
                    // nada apenas para manter as mesmas condições de comparação
                }
            }
            long t1 = System.currentTimeMillis();
            System.out.println(String.format("Processo 1: tempo %d ms  linhas inseridas %d", (t1 - t0), contador));
            ps.close();

        } catch (java.sql.SQLException ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            closeSilent(in);
            closeSilent(ps);
            closeSilent(con);
        }
    }

    public static void process2(File arq) {
        // ...
            long t0 = System.currentTimeMillis();
            String linha = null;
            while ((linha = in.readLine()) != null) {
                contador++;
                //ps.setInt(1, contador++);
                ps.setString(1, linha);
                ps.executeUpdate();
                if (contador % 50000 == 0) {
                    System.out.print(".");
                }
            }
            long t1 = System.currentTimeMillis();
     //..
  }

    public static void process3(File arq) {
     //...
            long t0 = System.currentTimeMillis();
            String linha = null;
            while ((linha = in.readLine()) != null) {
                contador++;
                //ps.setInt(1, contador++);
                ps.setString(1, linha);
                ps.addBatch();
                //ps.executeUpdate();
                if (contador % 50000 == 0) {
                    System.out.print(".");
                    ps.executeBatch();
                }
            }
            ps.executeBatch();
            long t1 = System.currentTimeMillis();
//...
}

Os resultados foram:
Processo 1: tempo 108054 ms linhas inseridas 745328
Processo 2: tempo 108914 ms linhas inseridas 745328
Processo 3: tempo 114656 ms linhas inseridas 745328

Não acredite no resultado, verifiquei o código e executei novamente o processo 2 e 3:
Processo 2: tempo 106903 ms linhas inseridas 745328
Processo 3: tempo 106226 ms linhas inseridas 745328

O procedumento 3 não deveria ser bem melhor (menos tempo) que o procedimento 2?

Versão do driver do MySQL 5.1.10
Versão do java: 1.6.0_18

Alguém tem alguma idéia? o que está errado no código?

vw

Criado 5 de setembro de 2010
Respostas 0
Participantes 1