Mój projekt używa hibernacji z menedżerem transakcji wiosennych, a moja baza danych to postgres (może być nieistotna).Obsługa ograniczenia bazy danych hibernacji
Próbuję odczytać duże pliki xml i skonstruować obiekty z nich (obiekty nie są duże, ale ilość jest) i wstawić je do bazy danych.
Jeśli przez przypadek jeden z moich obiektów narusza ograniczenia bazy danych, cały proces zatrzymuje się. Jak mogę pominąć te, które naruszają ograniczenia bazy danych? ewentualnie zalogować ich identyfikator lub cokolwiek do pliku dziennika?
aktualizacja Pytanie:
Byłem przeglądania koryta SO i okazało się, że dla wkładek wsadowych najlepiej zaleca się stosowanie sesji Stateless ale wciąż ten sam problem i wstawić zatrzymuje:
May 26, 2012 4:45:47 PM org.hibernate.util.JDBCExceptionReporter logExceptions
SEVERE: ERROR: duplicate key value violates unique constraint "UN_FK"
Detail: Key (fid)=(H1) already exists.
Oto odpowiednie części mojego kodu do parsowania xml i wstawiania do db, dla uproszczenia załóżmy, że wstawiam filmy:
//class field
@Autowired
private SessionFactory sessionFactory;
@Override
public void startDocument() throws SAXException {
session = sessionFactory.getCurrentSession();
}
@Override
public void endElement(String uri, String localName, String qName) throws SAXException {
if (qName.equalsIgnoreCase("FILM")) {
movie.setCategory(category);
movie.setAdded(new Date());
session.insert(movie);
}
}
Mam tę właściwość ustawioną w app-ctx hibernate.jdbc.batch_size
na 100. Czy naprawdę należy wybrać przed wstawieniem, aby tego uniknąć?
Aktualizacja 2:
Jeśli używam StatelessSession
zamiast sesji, mam arround 20 wkładki i od przystanków przetwarzania czas nieokreślony bez wyjątku czy cokolwiek.
Zakładam, że numer 20 jest, ponieważ łączę połączenia z tomcat i mam maxActive="20"
.
Bounty Aktualizacja:
Chciałbym naprawdę kochać, aby zobaczyć rozwiązanie ktoś oferta (bez obronny wybierz jeśli to możliwe). Używanie statelessSession lub po prostu sesja.
Prosta instrukcja try catch nie zrobi. Po wystąpieniu wyjątku przez Hibernate, stan sesji jest niespójny, transakcja musi zostać wycofana, a sesja zamknięta. Co więcej, wyjątek zostanie rzucony tylko w czasie spłukiwania, długo po tym, jak utrwalono wadliwy zapis. –
Dlatego zaleca się stosowanie bezstanowej sesji hibernacji w takich przypadkach. Zapobiegnie to niespójnemu stanowi, a także zmniejszy zużycie pamięci (lub nie będziesz musiał eksmitować już leczonych podmiotów) –