Como ignorar ConstraintViolationException

2 respostas
D

Pessoal,

Tenho uma sessão de Hibernate, onde armazeno diversos objetos persistidos. E no final da rotina preciso comitar esta operação.
Preciso comitar somente no final da rotina, após armazenar diversos objetos na sessão, para não perder em performance, pois é uma rotina bem delicada e que exige muita performance.
Porém estes objetos que carrego na sessão, muitos deles vão violar unique keys no banco de dados, preciso encontrar uma forma para que ao comitar a transação, ela ignore os erros de ConstraintViolationException, e comite todas as operações que não gerem exceção.

Não posso fazer consulta no banco antes de armazenar os objetos na sessão, pois isso iria consumir recursos e roubaria muita performance da aplicação. O que preciso mesmo é ignorar erros de ConstraintViolationException, e comitar todo o resto da operação.

Alguém sabe se tenho como fazer isso? Alguma idéia?

Detalhes da aplicação:
Java 1.6.x
Hibernate 3.2.5
Postgres 8.2.6

Att,

Diego.

2 Respostas

R

Diego joga esses dados em um ArrayList ae depois quando for armazenar vc faz um loop nesse array e dentro do loop faz um try catch para esse possivel erro, pq ae quando der o erro ele entra no catch, faz algo que vc desejar, e depois continua o loop.

D

Cara, o problema é um pouco mais complexo…hehehe. Na verdade são diversos dados, não tenho como colocar todos em um ArrayList. E isso não seria nada performático.
Recebo um frame de dados via socket, que pode conter até 4mb de informações, e posso receber até 10000 frames por minuto. Este frame de dados é dividido em diversas informações diferentes, que são separadas em objetos diferentes.
Preciso salvar em uma session cada tipo de informação, dar um flush para o banco de dados e um clear para liberar memória. No final de toda a operação dou um comit. No momento que dou um flush, é levatada a exception ConstraintViolationException, porém consigo capturar e ignorar (com um catch vazio por exemplo). O problema é que desta forma, quando vou dar o próximo flush, a transação foi marcada para rollback pelo flush anterior, e não consigo seguir a execução do problema.
Como o volume de dados é muito grande seria ruim comitar a cada tipo de informação, consultar no banco para ver se esta informação já existe antes de salvar na sessão seria ainda menos performático. E infelizmente o frame que recebo vem de uma aplicação C++ e que não tem como filtrar os dados antes de enviar, ou seja, vai sempre me enviar alguns dados duplicados.
Problema chato o meu não acha? Rsrsrsrs

Criado 18 de abril de 2008
Ultima resposta 18 de abr. de 2008
Respostas 2
Participantes 2