使用mybatis插入2000条记录时的性能问题(3.2.8版本)

时间:2016-03-16 13:08:43

标签: performance mybatis bulkinsert database-performance spring-mybatis

我正在尝试批量插入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条记录的异常。

  3. 请帮我解决这个问题。提前谢谢。

1 个答案:

答案 0 :(得分:0)

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

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

        }
    });