В моем проекте используется спящий режим с менеджером транзакций 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 или просто сеанс.