java批量导入效率优化
2023-12-18 22:35:29
在项目开发中,批量导入是常常需要开发的功能,但由于要跟数据库数据关联,往往都需要去查询对应的数据,所以查询数据的方式往往决定导入的效率,那么下面介绍一下该如何提高效率。
-
循环中不要查询数据库,循环查表是不可取的,效率甚至会拉低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()); } }
-
复杂逻辑取值可以存入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秒 }
-
分批次插入。如果直接传参使用sql批量插入,数据量很大的话可能会抛出数据包限制异常不可取,一条一条插入的话执行sql过多更不可取。可以使用JDBC的addBatch,也可以自己分批次提交。
-
往往上面3种方法就够了,如果数据量过大可考虑使用线程,将数据切为莫干集合进行操作。
写的比较匆忙,后面优化~
文章来源:https://blog.csdn.net/jl15988/article/details/135072127
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!