обработка ограничения базы данных в спящем режиме

В моем проекте используется спящий режим с менеджером транзакций Spring, а моя база данных — postgres (может быть, не имеет значения).

Я' Я пытаюсь читать большие xml-файлы и создавать из них объекты (объекты невелики, но количество большое) и вставлять их в базу данных.

Если по какой-то причине один из моих объектов нарушает ограничение базы данных, весь процесс останавливается.Как может Я пропускаю те, которые нарушают ограничение базы данных? Альтернативно записывать их идентификатор или что-то еще в файл журнала?

Обновление вопроса:

Я просматривал SO и обнаружил, что для пакетных вставок лучше всего рекомендуется использовать сеанс без сохранения состояния но я все еще получаю ту же проблему и вставляю остановки:

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.

Вот соответствующие части моего кода для разбора xml и вставки в БД, для простоты предположим, что я вставляю фильмы:

//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);
    }
}

У меня есть это свойство, установленное в app-ctx hibernate.jdbc.batch_sizeна 100. Это действительно n необходимо сделать выбор перед вставкой, чтобы избежать этого?

Обновление 2:

Если я использую StatelessSessionвместо сеанса, я получаю около 20 вставок, после чего обработка останавливается на неопределенный срок без каких-либо исключений или чего-либо еще.

Я предполагаю, что число 20 связано с тем, что я объединяю соединения с tomcat и имею maxActive="20".

Обновление Bounty:

Мне бы очень хотелось, чтобы кто-нибудь предложил решение (без защитного выбора, если это возможно). Использование statelessSession или просто сеанс.

7
задан Sebastien Lorber 4 June 2012 в 14:55
поделиться