我正在尝试读取大型XML文件并从中构建对象(对象不大但数量很多),然后将它们插入数据库。
如果我的某个对象违反了数据库约束,则整个过程会停止。如何跳过违反数据库约束的对象?或者记录它们的ID或其他信息到日志文件中?
问题更新:
我已经在SO上浏览过,发现对于批量插入最好使用无状态session,但我仍然遇到同样的问题,插入操作停止:
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);
}
}
我在应用上下文中设置了属性
hibernate.jdbc.batch_size
为100。是否真的需要在插入之前进行选择以避免这种情况发生?如果我使用StatelessSession
而不是session,我会得到大约20个插入,然后处理会无限期地停止,没有任何异常或其他信息。我假设数字20是因为我正在使用tomcat池化连接并且有maxActive="20"
。我真的很希望看到有人提供解决方案(如果可能的话,不要使用防御性选择)。使用statelessSession或只是session。