Pessoal, tenho em meu sistema um módulo que faz importação de dados via arquivos .csv
cada linha significa um registro no banco. atualmente, eu abre uma transação, tento salvar, e dou commit, se ter
exception eu logo a linha que deu erro para depois verificar,
O problema é que tenho por exemplo 6000 linhas, vou ter que iniciar 6000 transações e commita-las, gostaria que
colocar em uma transação só, pore, se o registro 5999 der problema eu perco o bloco todo…
tem como eu simular uma save e se der exception eu salvo oque já foi processado trato a exception e continuo com o
processamento?
Uma alternativa para o que quer seria você iniciarlizar uma transação e ir realizando os inserts, caso ocorra algum problema você faz o commit em vez do rollabck, isso não teria problema…só um detalhe disso, cuido para você não estourar o segmento de rollback de seu banco, não crie transações muito grandes tente criar transações pequenas como 500 registros por vez, claro que isso depende muito do SGBD que tá usando, do tamanho da tabela, quantidade de campos, seus relacionamentos e contrainsts.
robertwgil
Hummm, quer dizer que se inicio a transação, insiro uns 100 inserts e no 101 dá uma exception,
ao invés de rollback e faço um commit mesmo assim, ele funciona? e o que deu exception, não é alterado/salvo?
rafaelglauber
robertwgil:
Hummm, quer dizer que se inicio a transação, insiro uns 100 inserts e no 101 dá uma exception,
ao invés de rollback e faço um commit mesmo assim, ele funciona? e o que deu exception, não é alterado/salvo?
veja bem…se você tá inserindo somente em uma tabela e chega em determinado registro que viola por exemplo alguma pk não tem problema algum comitar os anteriormente inseridos, vai ficar de fora somente o que deu erro, agora como vai ser o fluxo de sua aplicação após um erro eu não sei, vc vai parar? vai pular o erro e continuar?? mas que pode comitar pode.
ps. qual o SGDB que tá usando?
robertwgil
PostgreSQL
rafaelglauber
Pode testar ai que funciona…coloca algum dado errado no arquivo para simular um erro no momento da inserção e em vez de rollback você faz commit.
robertwgil
blz, valeu…
robertwgil
Outra duvida, se eu gravar sempre de 500 em 500, digamos que entre 0 e 500 ocorreram umas 50 exception e não dei nem commit e nem rollback,
quando der commit depois das 500, as 450 serão salvas normalmente?
Paulo_Silveira
sim! salvara os 450 sim…
cuidado tambem pra nao colocar muitos objetos no 1st level cache do hibernate… vc pode usar pra isso uma stateless session (factory.openStatelessSession) ou ficar chamando evict/clear na session (senao vc pode correr risco de tomar OutOfMemoryError)