当前位置: 首页 > >

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方法


}



?


?


?


?


?


?


?


?


?


?


?


?


?


?


?



友情链接: