我正在尝试批量插入Employee表中的2000条记录(使用mybatis)。我的要求是: 1.如果任何记录无法插入,则记录错误。 2.即使任何一条记录失败,也要继续插入。 3.如果任何一个记录失败,则不应对其他回滚发生。 4.表现良好。
Dao实施的示例代码:我在这里提出了2个场景。
在循环外调用sqlSession.commit()。
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(ExecutorType.BATCH);
BatchMapper batchMapper = sqlSession.getMapper(BatchMapper.class);
try
{
for(Employee e: empList){
batchMapper.addEmployee(e);
}
}
catch (Exception ex)
{
}
finally{
sqlSession.commit();
sqlSession.close();
}
在这种情况下,sqlSession.commit()在for循环之外。在调用sqlSession.commit()之后,立即对所有记录进行插入。这里性能很好,插入2000条记录需要4秒。 但我无法记录错误,也会在发生异常时停止插入。
在循环中调用sqlSession.commit()。
SqlSession sqlSession = MyBatisUtil.getSqlSessionFactory().openSession(ExecutorType.BATCH);
BatchMapper batchMapper = sqlSession.getMapper(BatchMapper.class);
try
{
for(Employee e: empList){
batchMapper.addEmployee(e);
sqlSession.commit();
}
}
catch (Exception ex)
{
}
finally{
sqlSession.close();
}
在这种情况下,sqlSession.commit()在for循环中。当我们调用sqlSession.commit()时,这里一个接一个地插入。这里表现不佳,插入2000条记录需要10分钟。 但是我能够记录错误并继续插入,即使发生例如第100条记录的异常。
请帮我解决这个问题。提前谢谢。
答案 0 :(得分:0)
如果您使用的是Java 8,请使用lambda表达式尝试并行流。
empList.stream().parallel().forEach(s -> {
try{
batchMapper.addEmployee(e);
sqlSession.commit();
} catch(Exception ex){
}
});