业务:需要从一个数据库查询百万级数据,在java程序中插入到另一个oracle数据库中
代码:
private final int persize = 1000;
/**
* 推送数据-流程
* @param tableCode 表名
* @param startTime 开始时间
* @param endTime 结束时间
* @return
*/
public boolean pushFrData(String username,String tableCode,String tableName,String startTime,String endTime){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
System.out.println("导入数据到名录库!");
boolean boo = false;
//表名集合
String [] str = tableCode.split(",");
String [] names = tableName.split(",");
startTime = startTime==""?"2000-01-01":startTime;
endTime = endTime==""?getCurrentDate():endTime;
//System.out.println("service 时间 "+startTime+" > "+endTime);
String start_Time = "to_date('"+startTime+"','%Y-%m-%d')";
String end_Time = "to_date('"+endTime+"','%Y-%m-%d')";
System.out.println("选择推送 "+str.length+" 张表");
//遍历表名集合
for(int i = 0;i= "+start_Time+" and s_ext_timestamp < "+end_Time;
System.out.println(sql);
int table_size = Integer.valueOf(frDao.query(sql).get(0).toString());
//System.out.println(table_size/persize);
int times = table_size%persize==0?table_size/persize:table_size/persize+1;
for(int t = 1; t <= times;t++){
int start = (t-1) * persize;
List
读取的话可以多线程读取,插入的话看以下链接:
https://segmentfault.com/sear...
https://segmentfault.com/sear...
1、数据保存到数据库可以使用批处理比如一次处理100条插入记录
2、不要一次性处理所有数据,可以将1W条数据分成两个线程来处理,这样可以充分利用cpu,同事不会导致大的阻塞
建议使用JDBC的批处理模式,搜索以下关键字:
addBatch(String query)
executeBatch()
建议1000条左右作为一个batch提交事务。
懒人方法:
在目标oracle数据库中建立分布式链接,直接insert into 目标表 select sql语句