我正在尝试在 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 条记录发生异常,我也能够记录错误并继续插入。
请帮我解决一下这个。提前致谢。