Excel 导入Oracle 数据库 EasyExcel

基础数据导入Oracle数据库,一个月数据量基本是10w加。原Excel 是03 版本最大行是6w不满足当前需求,导入xlsx POI解析慢还一不小心就内存不足,卧槽!!!!网上看到阿里的EasyExcel ,看到api 还不错,那就动手。

目标
1、导入时间不能太久(poi导入8w多都快10分多,可能是我用usermodel模式吧)
2、SQL新增方面:用connection.prepareStatement(sql); 批量新增
为了减少redolog的产生 sql加了/*+append */ +nologing 后来测时的时候,加上查redo 好像没查到太大差异,
3、EasyExcel 用的easyexcel-2.1.0-beta2 这个版本处理掉了excel内科学计数法导入时异常问题
easyexcel-2.1.0-beta2 jar
easyExcel API


// 读取excel内容  先搞了一个sheet  如果是多个sheet 可以去看easyexcel API  
fis = new FileInputStream(filePath);
ExcelReader excelReader = EasyExcel.read(fis,new ImpDataListener()).build();
ReadSheet readSheet = EasyExcel.readSheet(0).build();
excelReader.read(readSheet);
// 这里千万别忘记关闭,读的时候会创建临时文件,到时磁盘会崩的
excelReader.finish();

//
class ImpDataListener extends AnalysisEventListener<Map>{
	@Override
	public void doAfterAllAnalysed(AnalysisContext analysiscontext) {
		// 读取完excel 后要做的事情  批量新增 为了省掉开启关闭connection  利用这里可以在结束后执行关闭数据库连接
		Integer isEnd=1;
		if(dataArr.size()!=0){//为了把不足10000行的其他数据也新增到数据库
			batchSQL(params);
		}	
		
	}
	@Override
	public void invoke(Map map, AnalysisContext context) {
		//单行解析
		if(dataArr.size()==10000){
			//只执行批量插入动作
			batchSQL(params);
		}
	}
	@Override
	public void invokeHeadMap(Map headMap, AnalysisContext analysiscontext) {
		//解析表头要做的动作  这个还挺有有用的   在添加arr时有些参数先从这边取出来,不用反复取 
	}
	@Override
	public void onException(Exception exception, AnalysisContext context)throws Exception {
		// TODO Auto-generated method stub
		System.out.println("发生了异常信息异常信息");
		
	}

}

/**
* 
* 这边的具体sql就省区了
*  sql =insert /*+append */ into tab_a nologing (id)values(?)  
*  sql 到Oracle 共享池时,只在第一次解析,后续一样的sql不需要再次解析动作
*  sql解析能省下不少时间
*  /*+append */ +nologing  当时测时没法现加上和去掉时间差异,查redo size 差距很小 不知道是什么原因
**/
public void batchSQL(){
	connection.setAutoCommit(false);//关闭自动提交  最后一次性提交
	PreparedStatement ps=connection.prepareStatement(sql);
	//dosomething 
	

}

疑问:
为什么/*+append */ +nologing 加上和去掉时间没太大差别,欢迎大佬来指教

18w多的数据导入到oracle 数据库 花费不到30s 。我突然方了,完结撒花★,°:.☆( ̄▽ ̄)/$:.°★

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值