Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Travamento ao fazer muitos inserts

Tenho que fazer uma importação de arquivo txt delimitado por ponto e virgula para o mysql. estou fazendo um teste com 500000 registros.Estou usando JDBC e tentei de alguns modos:

1 - inserindo em massa

insert into rawreports(date, data, project_id) values (('$date1', '$data1', '$project_id1'),('$date2', '$data2', '$project_id2'), .....)")

esse método funciona porem apresenta travamento as vezes ao inserir poucos registros e sempre ao inserir muitos registros.

2 - inserindo um a um com insert. com autocommit true esse método funciona porem vai consumindo cada vez mais cpu até chegar aos 100% e dá uma sobrecarga e para o processo.

3 - tentei inserindo um a um com insert. com autocommit false e dando commit quando chega perto dos 100% de cpu, ou pausando o programa quando chega perto dos 100% de cpu, mas dá o mesmo erro do de cima

4 - estou pensando em fazer LOAD DATA INFILE. ja testei aqui e baixa 500000 em um segundo. porém se eu quiser tratar o arquivo e extrair as chaves estrangeiras para outras tabelas precisarei criar outros txts .. procede esse método? achei que fica bem gambi isso de criar varios txtzinhos..

Acho meio impossível nao ter outyra forma sem ser LOAD DATA INFILE. afinal e se fosse um crawler da internet eu teria que criar txts, isso nao faz o menor sentido.

Aguardando a resposta, e desde já agradeço pelo tempo concedido.

3 respostas
solução!

Antonio,

Tente fazer um só INSERT com multiplos dados como no exemplo :

https://social.msdn.microsoft.com/Forums/pt-BR/9cea56df-ec48-435e-89ec-acf5e5b501d9/insert-de-varios-registros-de-uma-so-vez-em-uma-tabela?forum=transactsqlpt

Crie um pacote menor pra testar. Basta separar os VALUES com vírgulas.

Espero ter ajudado Abs!

Primeiro, muito obrigado pela resposta.

Então, isso se encaixa na primeira situação que eu descrevi. Eu fazia os imports desse jeito. Até abri um outro tópico aqui porque pensei que era relacionado ao hardware. https://cursos.alura.com.br/forum/topico-trava-em-pc-fraco-83594

Mas gostei da parte que vc falou: Crie um pacote menor pra testar.

O projetoé privado, mas vou extrair os erros para alguns projetos no git publico, e se ainda depois de extrair estiver dando pau. eu volto pro forum com os links.

Acabei resolvendo o problema quando separei em partes. Vou ter que aplicar no sistema inteiro, espero que eu consiga, qualquer coisa eu posto de novo.

O Marcos está certo. Funciona sim esse método só não funciona se estiver assim:

abre conexão
    um monte de requisições
fecha conexão

E eu tive que fazer um ajuste no mariaDB

SET GLOBAL max_allowed_packet=1073741824;

https://github.com/antonio24073/mass_insert

Não repara não tem um monte de gambi no git, fiz em uma hora. Basicamente o arquivo Service que tem a tal parte com loops e inserts do clienteDAO que dá problema. é facil de entender nao precisa saber javafx, nem nada complicado não.

Se alguem tiver curiosidade está ai. Abraço, obrigado.