Java 导入20万数据 Mybatis和Excel 处理

简介: 最近在处理导入数据需求,原来的数据是几千行导入,一般的代码可满足。但是在导入数据进却发现一个excel有20几万数据,各种问题就出来了,首先是数据库会撑爆,因excel读入的数据太多内存也会溢出。

一、读取Excel数据,防止内存溢出
1、pom.xml导入依赖包

   <dependency>
         <groupId>com.monitorjbl</groupId>
         <artifactId>xlsx-streamer</artifactId>
         <version>2.1.0</version>
    </dependency>

2、核心代码如下:

public void importFinanceCostByExcel(File file) {
   
        InputStream is = null;
              //数据库关键是这几步
        SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);
        FinanceCostMapper financeCostBatchMapper = sqlSession.getMapper(FinanceCostMapper.class);
        int BATCH = 1000;

        try {
   
            is = new FileInputStream(file);
            Workbook workbook = StreamingReader.builder()
                    .rowCacheSize(1000)// number of rows to keep in memory (defaults to 10)
                    .bufferSize(1024)     // buffer size to use when reading InputStream to file (defaults to 1024)
                    .open(is);            // InputStream or File for XLSX file (required)
            Sheet sheet = workbook.getSheet("成本到箱表格");
            logger.info("Import Finance Cost Begin!");
            List<FinanceCost> financeCostList = new ArrayList<>();
            Date nowDate = new Date();
            int i = -1;
            for (Row row : sheet) {
   
                i++;
                if(i< 1)
                    continue;

                FinanceCost financeCost = this.excelRowToFinanceCost(row);
                financeCost.setAcreatedatetime(nowDate);
                financeCost.setAlastupdatetime(nowDate);
                financeCostBatchMapper.insert(financeCost);
                if(i != 0 && i % 1000 == 0) {
   
                    logger.info("Import Data : {} " ,i);
                    //批量新增
                    sqlSession .commit();
                    sqlSession.flushStatements();//这里还要研究一下,要不然数据库还是撑不住
                }

            }
            sqlSession.commit();
            sqlSession.close();
        } catch (FileNotFoundException e1) {
   
            e1.printStackTrace();
        } finally {
   
            if(is != null) {
   
                try {
   
                    is.close();
                } catch (IOException e) {
   
                    e.printStackTrace();
                }
            }
        }
        logger.info("Import Finance cost End!");
    }
相关文章
|
14天前
|
算法 Java 数据处理
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。
从HashSet到TreeSet,Java集合框架中的Set接口及其实现类以其“不重复性”要求,彻底改变了处理唯一性数据的方式。HashSet基于哈希表实现,提供高效的元素操作;TreeSet则通过红黑树实现元素的自然排序,适合需要有序访问的场景。本文通过示例代码详细介绍了两者的特性和应用场景。
32 6
|
13天前
|
存储 Java API
深入剖析Java Map:不只是存储数据,更是设计艺术的体现!
【10月更文挑战第17天】在Java编程中,Map是一种重要的数据结构,用于存储键值对,并展现了设计艺术的精髓。本文深入剖析了Map的设计原理和使用技巧,包括基本概念、设计艺术(如哈希表与红黑树的空间时间权衡)、以及使用技巧(如选择合适的实现类、避免空指针异常等),帮助读者更好地理解和应用Map。
47 3
|
21天前
|
存储 SQL 小程序
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
这篇文章详细介绍了Java虚拟机(JVM)的运行时数据区域和JVM指令集,包括程序计数器、虚拟机栈、本地方法栈、直接内存、方法区和堆,以及栈帧的组成部分和执行流程。
24 2
JVM知识体系学习五:Java Runtime Data Area and JVM Instruction (java运行时数据区域和java指令(大约200多条,这里就将一些简单的指令和学习))
|
22天前
|
数据处理 Python
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
这篇文章介绍了如何使用Python读取Excel文件中的数据,处理后将其保存为txt、xlsx和csv格式的文件。
41 3
Python实用记录(十):获取excel数据并通过列表的形式保存为txt文档、xlsx文档、csv文档
|
23天前
|
Java 数据库连接 Maven
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和MyBatis Generator,使用逆向工程来自动生成Java代码,包括实体类、Mapper文件和Example文件,以提高开发效率。
69 2
mybatis使用一:springboot整合mybatis、mybatis generator,使用逆向工程生成java代码。
|
23天前
|
SQL JSON Java
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
这篇文章介绍了如何在Spring Boot项目中整合MyBatis和PageHelper进行分页操作,并且集成Swagger2来生成API文档,同时定义了统一的数据返回格式和请求模块。
39 1
mybatis使用三:springboot整合mybatis,使用PageHelper 进行分页操作,并整合swagger2。使用正规的开发模式:定义统一的数据返回格式和请求模块
|
5天前
|
SQL Java OLAP
java实现“数据平滑升级”
java实现“数据平滑升级”
21 2
|
9天前
|
SQL Java 关系型数据库
java连接mysql查询数据(基础版,无框架)
【10月更文挑战第12天】该示例展示了如何使用Java通过JDBC连接MySQL数据库并查询数据。首先在项目中引入`mysql-connector-java`依赖,然后通过`JdbcUtil`类中的`main`方法实现数据库连接、执行SQL查询及结果处理,最后关闭相关资源。
|
10天前
|
搜索推荐 Java 数据库连接
Java|在 IDEA 里自动生成 MyBatis 模板代码
基于 MyBatis 开发的项目,新增数据库表以后,总是需要编写对应的 Entity、Mapper 和 Service 等等 Class 的代码,这些都是重复的工作,我们可以想一些办法来自动生成这些代码。
19 6
|
14天前
|
Java
Java Set以其“不重复”的特性,为我们提供了一个高效、简洁的处理唯一性约束数据的方式。
【10月更文挑战第16天】在Java编程中,Set接口确保集合中没有重复元素,每个元素都是独一无二的。HashSet基于哈希表实现,提供高效的添加、删除和查找操作;TreeSet则基于红黑树实现,不仅去重还能自动排序。通过这两个实现类,我们可以轻松处理需要唯一性约束的数据,提升代码质量和效率。
28 2