0

我正在尝试在 Employee 表中批量插入 2000 条记录(使用 mybatis)。我的要求是: 1. 如果有任何记录插入失败,则记录错误。2. 即使任何一条记录失败,也要继续插入。3. 如果任何一个记录失败,其他记录不应发生回滚。4、性能好。

Dao 实现示例代码:这里我想出了 2 个场景。

  1. 在循环外调用 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秒。但是我无法记录错误,并且在发生异常时它也会停止插入。

  2. 在循环内调用 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 条记录发生异常,我也能够记录错误并继续插入。

请帮我解决一下这个。提前致谢。

4

1 回答 1

0

如果您使用的是 java 8,请尝试使用 lambda 表达式的并行流。

empList.stream().parallel().forEach(s -> {
        try{
            batchMapper.addEmployee(e);
            sqlSession.commit();
        } catch(Exception ex){

        }
    });
于 2016-07-19T16:49:01.880 回答