Boa tarde a todos do forum…
estou teimando em usar o HSQL como banco do meu framework para
desenvolvimento rapido de aplicações desktop
Como os dados fazem parte do framework
estou inserindo na primeira vez que se abre a aplicação
TODOS os CEPS do Brasil (650.000 registros).
até os 6000 primeiros tudo ocorre numa boa,
mais depois a performance vai caindo em ritmo de P.G
o consumo de memória esta Ok e já tentei até
retirar todas as contraints e criar indices,
mais de nada adianta…
já tentei tb ficar compactando e reconectando durante o processo,
para eliminar o arquivo de LOG, mais tb não adiantou.
alguem sabe alguma manha esperta para fazer com que o HSQLDB
aceite tantos registros assim de maneira rapida?
o export da base aonde coletei os dados (Oracle 10g) demorou apenas 1 minuto
1º É natural a performance cair… afinal o arquivo onde as informações estão sendo inseridas esta ficando maior cada vez maior.
2º Procure pela documentação do banco que esta usando, motivo:
Vc tem que estar atento aos “rollbacks” alguns bancos armazenam as operações em memória para que ele possa voltar ao estado anterior caso ele msm falhe (isso é um procedimento interno do banco). Geralmete isto é configurado no Banco naum no aplicativo.
Outro ponto tire todos os indices de sua tabela… inserção com indices ativos é mais custosa
3º 300 linhas?!?!?!?! qdo tive que inserir uma qtde de dados grande assim (3,5 milhoes de registros) utilizava lotes de 5 mil a 25 mil dependendo, ler do disco e escrever no disco tem um custo alto, ler da memoria e escrever no disco o custo é um pouco menor.
amigo nao conheco hsqldb, mais acho q vc teria q estudar um pouco sobre o banco em questao como ele trata os arquivos como esta sendo armazenado na memoria, etc… 650.000 mil nao eh um numero mto elevado, teria q ter uma performance boa, vc precisa fazer essa carga soh uma vez? ou varias vezes?
dependendo se for soh uma vez nao tem problema vc pode carrega-lo em um horario de pouco uso e deixar carregando tudo… caso contrario, aconselho a usar outro banco de dados, pq esse ai nao vai te ajudar mto nao
Se queres tanto usar o HSQLDB, pergunte aos developers, foi o q fiz quando deparei com um problema crucial no H2DataBase a 2 anos atrás, falei com o developer principal e ele me deu a solução e o código q corrigia o bug em menos de 2h
É galera,
resolvi o problema…
usei addBatch()
e fiz tudo de uma só vez,
ai consegui num tempo aceitavel a inserção…
respondendo a pergunta que o gzofera fez, 650000 é pouco mesmo
e é só uma vez que eu insiro, só que a situação já ficava complicada nos 6000 primeiros
registros !!!
mais agora ta tudo resolvido, guardei meus POJOS em memória
e fiz por batch no final de tudo,
uma maravilha
[quote=dyorgio]É galera,
resolvi o problema…
usei addBatch()
e fiz tudo de uma só vez,
ai consegui num tempo aceitavel a inserção…
respondendo a pergunta que o gzofera fez, 650000 é pouco mesmo
e é só uma vez que eu insiro, só que a situação já ficava complicada nos 6000 primeiros
registros !!!
mais agora ta tudo resolvido, guardei meus POJOS em memória
e fiz por batch no final de tudo,
uma maravilha
Abs!!![/quote]
Pois é… foi o q eu disse…
Eu já passei por isso a uns anos atrás… ficava fazendo commit para cada insert… isto não se faz! Junta tudo no batch e depois comita tudo de uma vez e a DB se vira!
Agora vc nunca mais esquece, como eu… nunca mais esqueci, mas levei muito na cabeça
E outra dica basica, não fique abrindo e fechando conexões, abra apenas uma e reutilize a mesma até o fim para tudo q for fazer, mas esta já deves saber
A tabela em que vc. está inserindo possui algum tipo de PK ou índice ?
Neste caso, o tempo de insert sempre vai decair com o tempo, já que, a cada insert, o banco tem que checar os registros existentes para verificar se há violação de alguma chave única.
Uma possibilidade é vc. criar a tabela sem nenhum tipo de índice, inserir tudo e, no final, criar os índices necesários.
Cara, como mencionei tentei não criar nenhum indice ou constraint,
mas mesmo assim o HSQLDB não aguentava
ai eu resolvi temporariamente usando BATCH`s
só que agora eu resolvi da maneira correta
troquei para H2, como alguns ai me aconselharam…
realmente ficou perfeito, e é totalmente compativel com o HSQLDB
menos alguns errorCodes, mais foi preciso poucos, quase nenhum,
ajuste no meu framework, de quebra ficou tudo mais rapido no sistema…
uso, inicialização e finalização
então ai vai a dica, HSQLDB é pra quem quer fazer uma base pra pouco
conteudo, até porque a do H2 ficou maior…
Mais velocidade, standalone, 100% Java, free… é com o H2 database
H2 database é um projeto do mesmo criador do Hypersonic, o projeto que deu inicio ao HSQLDB ( na verdade o Hypersonic parou e um grupo pegou e continuou com o nome de HSQLDB ). Mesmo sendo compatível com HSQLDB, não compartilha nenhum código sendo reescrito do zero. Particulamente gosto mais do H2 como banco embarcado, apesar do Derby ser bem interessante.