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;
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