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.
[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
Mas obrigado por tentar ajudar
[quote=romarcio]Você precisa usar insert em lote(batch). Dai fica rapido.
Um exemplo:
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?[/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
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);