Duvida com Inserts

8 respostas
gaulix

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()); } }

8 Respostas

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.

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(); } } }

gaulix

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.

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

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(); } } }

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:

gaulix

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 ‘=’

romarcio

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

Quanto tempo levou para adicionar os 16000 registros?

gaulix

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

Quanto tempo levou para adicionar os 16000 registros?

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:

romarcio

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

Quanto tempo levou para adicionar os 16000 registros?

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

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.

gaulix

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

Quanto tempo levou para adicionar os 16000 registros?

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

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.

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

Criado 31 de março de 2012
Ultima resposta 1 de abr. de 2012
Respostas 8
Participantes 3