Duvida com Inserts

Galera, seguinte, fiz um programa que lê um arquivo .sql com queries, só que nele tem cerca de 16 mil INSERTS, e quando o programa faz os inserts demooora…

Não sei como deixar mais rápido, alguem ai tem uma sugestão?

meu código pra fazer os inserts:

public void GravaMap() throws Exception { try { TestDAOImpl trav = new TestDAOImpl(); BufferedReader in = new BufferedReader(new FileReader("xxx.sql")); String str; trav.apaga(); //só limpa o banco antes de começar os inserts int i = 0; while ((str = in.readLine()) != null) { trav.salvar(str); } in.close(); } catch (IOException e) { System.out.println("Erro: " + e.getMessage()); } }

Acho melhor você pegar no arquivo sql e deixar todas as querys nativas la com os insert. Daí você vai lendo linha por linha do arquivo e armazena em um StringBuffer. Depois é só você separar a string usando o split e passando parâmetro como ;, assim ele vai separar cada comando sql, caso tenha mais de um. Depois você faz um for no array que irá retornar e com SQLQuery caso use o Hibernate, executa a query no bd.

Se ficou difícil intender aí vai um exemplo:

BufferedReader in = new BufferedReader(new FileReader("xxx.sql"));
StringBuffer sb = new StringBuffer("");
String s;

while ((s = in.readLine()) != null) { // Lê o arquivo linha por linha
  sb.append(s + "\n");
}

in.close();

String[] scripts = sb.toString().split(";"); // Separa os comandos

for (String sql : scripts) { // Percorre os comandos
  if (sql != null && !sql.equals("") && !sql.equals("\n")) { // Verifica se a linha não está em branco
    // chama algum código que execute o script, parecido com isso para o hibernate
    SQLQuery query = session.createSQLQuery(sql);
    query.executeUpdate();
  }
}

Obs.: Com um código quase igual o de cima, eu executo um insert de 5 mil registros, adicionando todas as cidade e estados brasileiros no bd, e quase nem percebo.

Você precisa usar insert em lote(batch). Dai fica rapido.
Um exemplo:

private void salvarDB() { Connection conn = null; Statement stmt = null; List<String> list = metodoQueRetornaListComOsInserts(); try { conn = ConexaoDB.getConnection(); stmt = conn.createStatement(); for (String s : list) { stmt.addBatch(s); } if (stmt != null) { stmt.executeBatch(); stmt.clearBatch(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }

[quote=esdras_63]Acho melhor você pegar no arquivo sql e deixar todas as querys nativas la com os insert. Daí você vai lendo linha por linha do arquivo e armazena em um StringBuffer. Depois é só você separar a string usando o split e passando parâmetro como ;, assim ele vai separar cada comando sql, caso tenha mais de um. Depois você faz um for no array que irá retornar e com SQLQuery caso use o Hibernate, executa a query no bd.

Se ficou difícil intender aí vai um exemplo:

BufferedReader in = new BufferedReader(new FileReader("xxx.sql"));
StringBuffer sb = new StringBuffer("");
String s;

while ((s = in.readLine()) != null) { // Lê o arquivo linha por linha
  sb.append(s + "\n");
}

in.close();

String[] scripts = sb.toString().split(";"); // Separa os comandos

for (String sql : scripts) { // Percorre os comandos
  if (sql != null && !sql.equals("") && !sql.equals("\n")) { // Verifica se a linha não está em branco
    // chama algum código que execute o script, parecido com isso para o hibernate
    SQLQuery query = session.createSQLQuery(sql);
    query.executeUpdate();
  }
}

Obs.: Com um código quase igual o de cima, eu executo um insert de 5 mil registros, adicionando todas as cidade e estados brasileiros no bd, e quase nem percebo.[/quote]

Olá esdras_63, eu usei seu código, mas continuou na mesma velocidade :frowning:
Mas obrigado por tentar ajudar :smiley:

[quote=romarcio]Você precisa usar insert em lote(batch). Dai fica rapido.
Um exemplo:

private void salvarDB() { Connection conn = null; Statement stmt = null; List<String> list = metodoQueRetornaListComOsInserts(); try { conn = ConexaoDB.getConnection(); stmt = conn.createStatement(); for (String s : list) { stmt.addBatch(s); } if (stmt != null) { stmt.executeBatch(); stmt.clearBatch(); } } catch (SQLException e) { e.printStackTrace(); } finally { try { if (stmt != null) { stmt.close(); } if (conn != null) { conn.close(); } } catch (SQLException e) { e.printStackTrace(); } } }
[/quote]

Usei seu código, ficou mais rápido, apesar de eu não ter entendido onde que o banco é apagado pra inserir os novos dados :roll:

Obrigado :smiley:

Ignore a parte que eu digo que não sabia onde o código apagava meu banco, na verdade ele não apaga, o meu banco é que tava limpo quando eu executei ‘=’

O código que passei não apaga nada, só faz insert.

Quanto tempo levou para adicionar os 16000 registros?

O código que passei não apaga nada, só faz insert.

Quanto tempo levou para adicionar os 16000 registros?[/quote]

Fiz 17380 Inserts e levou 11 minutos pra fazer, ainda ta demorado, mas antes demorava mais :lol:
Deve ser por causa do meu processador de 1.6GHZ com 1 núcleo :lol:

segunda eu testo em um processador bem melhor e vejo o tempo que vai levar :smiley:

O código que passei não apaga nada, só faz insert.

Quanto tempo levou para adicionar os 16000 registros?[/quote]

Fiz 17380 Inserts e levou 11 minutos pra fazer, ainda ta demorado, mas antes demorava mais :lol:
Deve ser por causa do meu processador de 1.6GHZ com 1 núcleo :lol:

segunda eu testo em um processador bem melhor e vejo o tempo que vai levar :D[/quote]

Puxa tudo isso? Eu fiz um teste com esse mesmo código em 5000 registros e não levou nem 2 segundos. Mas meu processador é um pouco melhor, de repente é isso mesmo.

O código que passei não apaga nada, só faz insert.

Quanto tempo levou para adicionar os 16000 registros?[/quote]

Fiz 17380 Inserts e levou 11 minutos pra fazer, ainda ta demorado, mas antes demorava mais :lol:
Deve ser por causa do meu processador de 1.6GHZ com 1 núcleo :lol:

segunda eu testo em um processador bem melhor e vejo o tempo que vai levar :D[/quote]

Puxa tudo isso? Eu fiz um teste com esse mesmo código em 5000 registros e não levou nem 2 segundos. Mas meu processador é um pouco melhor, de repente é isso mesmo.[/quote]

pode até ser por causa do tamanho do insert e do número de colunas que vai inserir…

ó o insert: INSERT INTO world VALUES (1184,-18,399,3,75415,‘03#NVS?’,1345,‘sdaf’,12,‘NVS? A’,253);