基础数据导入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 。我突然方了,完结撒花★,°:.☆( ̄▽ ̄)/$:.°★ 。