Java写入大字符串到oracle数据库_java程序如何提高oracle百万级数据的insert效率
業務:需要從一個數據庫查詢百萬級數據,在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
System.out.println("所選數據表: "+str[i]);
//字段集合
String [] arr = fillService.getIdenCode(str[i]);
String iden_code = "";
//遍歷字段
for(int j = 0;j
iden_code += ""+arr[j]+",";
}
//表字段
iden_code = iden_code.substring(0,iden_code.length()-1);
//System.out.println(str[i]+"總共 "+arr.length+" 個字段!");
//得到推送數據集合
String sql = "select count(*) from "+str[i] +" where s_ext_timestamp >= "+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 lists = getData(str[i], iden_code,startTime,endTime,start);
//推送數據
System.out.println("準備導出第 "+t+" 批數據");
push(lists,str[i],iden_code);
System.out.println("已導出第 "+t+" 批數據");
}
try{
if(table_size > 0){
addLog(username,str[i].toString(),names[i].toString(),table_size,"1",sdf.parse(startTime),sdf.parse(endTime));
}
}catch (ParseException e){
System.out.println("日期格式轉換異常");
}
}
return boo;
}
/**
* 推送數據
* @param lists 數據集
* @param table 表名
* @param iden_code 字段集
*/
private int push(List lists,String table,String iden_code){
boolean boo = false;
int count = 0;
//遍歷數據結果集
if(lists.size()>0){
for(int k = 0;k < lists.size();k++){
Object [] obj = lists.get(k);
String val = ""; //將數據轉換成String類型
for(Object s:obj){
//val += "'"+s.toString()+"',";
if(s != null){
val += "'"+s.toString()+"'|";
}else{
val += "''|";
}
}
val = val.substring(0,val.length()-1);
String etpsid = "";
String [] iden = iden_code.split(",");
String [] value = val.split("\\|");
String val2 = "";//格式化數據(日期)
if(iden.length == value.length){
//格式化sql語句的時間
for(int i = 0;i
//判斷字段是否是date類型
if(getDateType(table, iden[i])){
//格式化字符串 防止出現datetime類型 1900-01-01 00:00:00.0的情況
if(value[i].length() > 4){
String vv = value[i].substring(value[i].length()-3,value[i].length());
if(vv.contains(".")){
val2 += "to_date("+value[i].substring(0,value[i].length()-3)+"','YYYY-MM-DD HH24:MI:SS'),";
}else{
val2 += "to_date("+value[i]+",'YYYY-MM-DD HH24:MI:SS'),";
}
}else{
val2 += "'',";
}
}else{
val2 += value[i]+",";
}
if("ETPSID".equals(iden[i])){
etpsid = value[i];
}
}
val2 = val2.substring(0,val2.length()-1);
}else{
/*System.out.println(iden.length+" : "+value.length);
for(int j = 0 ;j< value.length;j++){
System.out.println(value[j]);
}*/
System.out.println("推送數據和字段不一致");
}
String mlk_table = getMlkTable(table);
String mlk_code = getMlkCode(iden_code,table);
//插入數據sql
//String sql = "insert into "+table+"("+iden_code+") values ("+val2+")";
//生成流水號
String uuid = UUID.randomUUID().toString();
uuid = uuid.replace("-","");
val2 += ",'"+uuid+"'";
String sql = "insert into "+mlk_table+"("+mlk_code+") values ("+val2+")";
if(etpsid != ""){
//System.out.println(etpsid);
//工商增量數據按日依"企業唯一標識"為關鍵字,更新、追加至名錄庫表中
String s_sql = "select * from "+mlk_table+" where 企業唯一標識 = "+etpsid;
//System.out.println(s_sql);
int s = mlDao.query(s_sql).size();
if (s > 0){
String update_sql = "";
String [] update_code = mlk_code.split(",");
for(int j = 0;j < iden_code.split(",").length;j++){
//判斷字段是否是date類型
if(getDateType(table, iden[j])){
//格式化字符串 防止出現datetime類型 1900-01-01 00:00:00.0的情況
if(value[j].length() > 4){
String vv = value[j].substring(value[j].length() - 3, value[j].length());
if(vv.contains(".")){
update_sql += update_code[j]+" = "+ "to_date("+value[j].substring(0, value[j].length() - 3)+"','YYYY-MM-DD HH24:MI:SS'),";
}else{
update_sql += update_code[j]+" = "+ "to_date("+value[j]+",'YYYY-MM-DD HH24:MI:SS'),";
}
}else{
update_sql += update_code[j]+" = "+ "'',";
}
}else{
update_sql += update_code[j]+" = "+ value[j]+",";
}
//update_sql += update_code[j]+" = "+update_val[j]+",";
}
update_sql += "流水號 = '"+uuid+"'";
update_sql = "update "+mlk_table+" set "+update_sql+" where 企業唯一標識 = "+etpsid;
//System.out.println("/// /\n"+update_sql+"\n");
sql = update_sql;
System.out.println("更新 "+mlk_table+" 標識 "+etpsid);
}else{
System.out.println("插入 "+mlk_table+" 標識 "+etpsid);
}
}
//System.out.println(sql);
try{
//循環執行sql
mlDao.execute(sql);
count++;
System.out.println(table+" 推送第 "+count+" 條");
}catch (Exception e){
System.out.println("sql執行異常!");
}
}
System.out.println(table+" 表共插入 "+count+" 條數據!");
}else{
System.out.println(table+" 表共插入 "+count+" 條數據!");
System.out.println("導入數據為空!");
}
return count;
}
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
以上是生活随笔為你收集整理的Java写入大字符串到oracle数据库_java程序如何提高oracle百万级数据的insert效率的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: mac怎么用python2和3_Mac同
- 下一篇: java循环队列配对_循环队列 链式队列