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<BillReadModelTest> 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方法
}
还没有评论,来说两句吧...