java批量导入效率优化

在项目开发中,批量导入是常常需要开发的功能,但由于要跟数据库数据关联,往往都需要去查询对应的数据,所以查询数据的方式往往决定导入的效率,那么下面介绍一下该如何提高效率。

  1. 循环中不要查询数据库,循环查表是不可取的,效率甚至会拉低90%以上。我们可以提前将所需数据整体获取出来,为方便取值,可将数据转为Map集合,提高取值效率。

    private BookTypeMapper bookTypeMapper;
    
    public void importData(List<Book> books) {
        // 先获取全部类型然后转Map
        List<BookType> bookTypes = bookTypeMapper.list();
        Map<String, BookType> bookTypeMap = bookTypes.stream().collect(Collectors.toMap(BookType::getBookTypeId, bookType -> bookType));
        for(Book book : books) {
            // 赋值类型名称
            BookType bookType = bookTypeMap.get(book.getTypeId);
            book.setTypeName(bookType.getBookName());
        }
    }
    
  2. 复杂逻辑取值可以存入Map缓存,避免多次处理,提高效率。如下如果getBookClass耗时0.003秒,books有2000条数据,如果每次重新获取则耗时0.003*2000 = 6秒,效率很低,所以尽量能将相同值的数据存入缓存获取。

    public void importData(List<Book> books) {
        Map<String, String> classCache = new HashMap<>();
        for(Book book : books) {
            String classId = book.getClassId();
            if (classCache.containsKey(classId)) {
                book.setClass(classCache.get(classId));
            } else {
                String bookClass = this.getBookClass(classId);
                book.setClass(bookClass);
                classCache.put(classId, bookClass);
            }
        }
    }
    
    public String getBookClass(String classId) {
        // 假设这里的处理逻辑耗时0.003秒
    }
    
  3. 分批次插入。如果直接传参使用sql批量插入,数据量很大的话可能会抛出数据包限制异常不可取,一条一条插入的话执行sql过多更不可取。可以使用JDBC的addBatch,也可以自己分批次提交。

  4. 往往上面3种方法就够了,如果数据量过大可考虑使用线程,将数据切为莫干集合进行操作。

写的比较匆忙,后面优化~

  • 7
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

会功夫的李白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值