Java 使用EasyExcel批量导入excle数据到Oracle数据库

1、读取excel数据,插入Oracle数据库。

2、使用数据100万条。

测试100万条数据的插入Oracle数据库
    批处理条数  时间
    2500   50466毫秒
    2500   59945毫秒
    2500   55605毫秒
    2000   51228毫秒
    2000   57499毫秒
    3000   52740毫秒
    5000   53282毫秒

读取文件开始
sql开始
sql结束,使用时间:15627毫秒
excel的sheet长度:1000000
读取文件并执行sql结束,使用时间:62094毫秒
读取文件开始
sql开始
sql结束,使用时间:12030毫秒
excel的sheet长度:1000000
读取文件并执行sql结束,使用时间:60083毫秒

总结:发现读取excel花费的时间才是最多了。

100万条数据插入数据库时间大概15秒左右。50秒时间读取数据。总共60秒。

1、

@Test
public void saxReadJavaModelV2007_test() throws IOException {
    System.out.println("读取文件开始");
    long start = System.currentTimeMillis();

    InputStream inputStream = new FileInputStream(new File("D:\\aaa\\abc_2007.xlsx"));
    ExcelListenerTest excelListener = new ExcelListenerTest();
    EasyExcelFactory.readBySax(inputStream, new Sheet(1, 1, BillReadModelTest.class), excelListener);
    inputStream.close();

    long stop = System.currentTimeMillis();
    System.out.println("读取文件并执行sql结束,使用时间:"+(stop-start)+"毫秒");
}

2、

import cn.com.JdbcUtil.JDBCUtil;
import cn.com.model.BillReadModelTest;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;

public class ExcelListenerTest extends AnalysisEventListener {

    private static  Connection conn = JDBCUtil.getConnection();
    private  static final  int initialCapacity = 1000000;

    private List  data = new ArrayList<>(initialCapacity);

    @Override
    public void invoke(Object object, AnalysisContext context) {
        data.add((BillReadModelTest) object);
          //方式1:当读取到initialCapacity条数据的时候,插入一次数据库,清空list
//        if(data.size() >= initialCapacity){
//           doSomethingForTwo();
//           data = new ArrayList<>(initialCapacity);
//        }
         //方式2:把所有的excel数据全部读取到内存中,最后批量插入数据库
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext context) {
        //解析结束销毁不用的资源
        //注意不要调用datas.clear(),否则getDatas为null
        //方式1:把剩下的插入数据库
//        doSomethingForTwo();
       //方式2:把所有的excel数据全部读取到内存中,最后批量插入数据库
        System.out.println("sql开始");
        long start = System.currentTimeMillis();
        doSomethingForOne();
        long stop = System.currentTimeMillis();
        System.out.println("sql结束,使用时间:"+(stop-start)+"毫秒");
        System.out.println("excel的sheet长度:"+data.size());
    }

    public void doSomethingForOne(){
        PreparedStatement ps = null;
        try {
            //关闭自动提交,即开启事务
            conn.setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        String sql = " insert into testimport(a,b,c,d,e,f,g,h,i,j) values (?,?,?,?,?,?,?,?,?,?) ";
        //设置批量处理的数量
        int batchSize = 2500;
        try {
            //创建语句对象
            ps = conn.prepareStatement(sql);
            for(int i = 0; i < data.size(); i++){
                BillReadModelTest md = data.get(i);
                ps.setString(1,md.getBillno());
                ps.setString(2,md.getA());
                ps.setString(3,md.getB());
                ps.setString(4,md.getC());
                ps.setString(5,md.getD());
                ps.setString(6,md.getE());
                ps.setString(7,md.getF());
                ps.setString(8,md.getG());
                ps.setString(9,md.getH());
                ps.setTimestamp(10,new Timestamp(md.getI().getTime()));

                ps.addBatch();
                // 当数据满100条批量插入
                if (i > 0 && i % batchSize == 0 ) {
                    // 语句执行完毕,提交本事务
                    ps.executeBatch();
                    ps.clearBatch();
                    // 此处的事务回滚是必须的
                    try {
                        conn.commit();
                    } catch (Exception e) {
                        conn.rollback();
                    }
                }
            }
            // 如果数据不为倍数的话,最后一次会剩下一些
            // 语句执行完毕,提交本事务
            ps.executeBatch();
            ps.clearBatch();
            try {
                conn.commit();
            } catch (Exception e) {
                conn.rollback();
            }
            // 在把自动提交打开
            conn.setAutoCommit(true);
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.closeResource(null,ps,null);
        }

    }

    public void doSomethingForTwo() {
        PreparedStatement ps = null;
        try {
            //关闭自动提交,即开启事务
            conn.setAutoCommit(false);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        String sql = " insert into testimport(a,b,c,d,e,f,g,h,i,j) values (?,?,?,?,?,?,?,?,?,?) ";
        try {
            //创建语句对象
            ps = conn.prepareStatement(sql);
            for(int i = 0; i < data.size(); i++){
                BillReadModelTest md = data.get(i);
                ps.setString(1,md.getBillno());
                ps.setString(2,md.getA());
                ps.setString(3,md.getB());
                ps.setString(4,md.getC());
                ps.setString(5,md.getD());
                ps.setString(6,md.getE());
                ps.setString(7,md.getF());
                ps.setString(8,md.getG());
                ps.setString(9,md.getH());
                ps.setTimestamp(10,new Timestamp(md.getI().getTime()));

                ps.addBatch();
            }
            // 如果数据不为倍数的话,最后一次会剩下一些
            // 语句执行完毕,提交本事务
            ps.executeBatch();
            try {
                conn.commit();
            } catch (Exception e) {
                conn.rollback();
            }
            // 在把自动提交打开
            conn.setAutoCommit(true);
        }catch (SQLException e) {
            e.printStackTrace();
        }finally {
            JDBCUtil.closeResource(null,ps,null);
        }
    }

}

3、

import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.metadata.BaseRowModel;

import java.util.Date;

public class BillReadModelTest extends BaseRowModel {
    @ExcelProperty(index = 0)
    private String billno;

    @ExcelProperty(index = 1)
    private String a;

        // 省略字段get, set方法

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Java,SE基础知识)