public static String genData(Connection dbConn,BASEVC BASEVC,String tableName,String RPDT,RPRJRTJ_PL JRTJPar,String sql){ JrtjComm JRTJComm=new JrtjComm(); String rtcd="0000"; String BKNO = CommonUtil.null2empty(BASEVC.getBKNO()); //String TSDT = CommonUtil.null2empty(BASEVC.getTSDT()); ResultSet rs = null; Statement stmt = null; PreparedStatement pstmt =null; long startTime = System.currentTimeMillis(); //獲取開始時間 測試用,生產可注釋 List<Map> dataList=new ArrayList <Map>(); try { logger.info(tableName+":"+sql); stmt=dbConn.createStatement(); rs = stmt.executeQuery(sql.toString()); long endTime = System.currentTimeMillis(); //獲取結束時間 測試用,生產可注釋 System.out.println("程序運行時間:" + (endTime - startTime) + "ms"); //輸出程序運行時間 測試用,生產可注釋 long startTime1 = System.currentTimeMillis(); // 獲取開始時間 測試用,生產可注釋 // 將查詢到的數據插入到表中 StringBuffer insert = new StringBuffer(); insert.append(" insert into ").append(tableName); insert.append(" (BKNO,CJRQ,ZHH,ZHMC,KHNBBM,KHHJRJGBM,KHHNBJGH,ZHBZ,ZHLX,KHRQ,XHRQ,ZHZT,SFKTWSYH,SFKTSJYH,ACST,STAT,SBTY) values "); insert.append( " (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)"); pstmt =dbConn.prepareStatement(insert.toString()); while (rs.next() ) { String ZHH = CommonUtil.null2empty(rs.getString("ZHH")); String ZHMC = CommonUtil.null2empty(rs.getString("ZHMC")); String KHNBBM = CommonUtil.null2empty(rs.getString("KHNBBM")); String KHHJRJGBM = CommonUtil.null2empty(rs.getString("KHHJRJGBM")); String KHHNBJGH = CommonUtil.null2empty(rs.getString("KHHNBJGH")); String ZHBZ = CommonUtil.null2empty(rs.getString("ZHBZ")); String ACTY = CommonUtil.null2empty(rs.getString("ACTY")); String ZHLX = CommonUtil.null2empty(rs.getString("ZHLX")); if("7".equals(ZHLX)){//個人結算戶 ZHLX="0"+ACTY; }else if("1".equals(ZHLX)){//個人儲蓄賬戶 ZHLX="04"; }else if("2".equals(ZHLX)){//基本存款賬戶 ZHLX="06"; }else if("3".equals(ZHLX)||"0".equals(ZHLX)||"6".equals(ZHLX)||"8".equals(ZHLX)||"9".equals(ZHLX)||"A".equals(ZHLX)){//一般存款賬戶 ZHLX="07"; }else if("D".equals(ZHLX) ||"5".equals(ZHLX)){//專用存款賬戶 ZHLX="08"; }else if("4".equals(ZHLX) || "B".equals(ZHLX) ||"C".equals(ZHLX)){//臨時存款賬戶 ZHLX="09"; } String KHRQ = CommonUtil.null2empty(rs.getString("KHRQ")); String XHRQ = CommonUtil.null2empty(rs.getString("XHRQ")); String ACST = CommonUtil.null2empty(rs.getString("ACST")); //原賬戶狀態 //String FEAM = CommonUtil.null2empty(rs.getString("FEAM")); //1正常、2休眠、3合同限制、4司法限制狀態 String ZHZT="1"; if("1".equals(ACST.substring(0,1))) { ZHZT="3";//銷戶,等於合同限制 }else if("1".equals(ACST.substring(4,5))){ ZHZT="2";//休眠 } else if (ACST.length()==9 ){ if (ACST.endsWith("2") || ACST.endsWith("1")) { ZHZT="3";//合同限制 } } else { CA CA=new CA();//借用 rtcd=zhTai(dbConn,ZHH,RPDT,BKNO,CA); if(!"0000".equals(rtcd)){ return rtcd; } String AA=CA.getACCT(); if("1".equals(AA)){//金額凍結或狀態凍結 ZHZT="4"; } } String ISNEW= CommonUtil.null2empty(rs.getString("ISNEW"));//**是不是修改的 **/ if(!ISNEW.equals("")){//如果空就是增加的,否則是新修改的,對修改的以前的信息上報類型進行修改 String ZHZTY= CommonUtil.null2empty(rs.getString("ZHZTY")); if(ZHZTY.equals(ZHZT)){ continue; } } String SFKTWSYH = CommonUtil.null2empty(rs.getString("SFKTWSYH")); String SFKTSJYH = CommonUtil.null2empty(rs.getString("SFKTSJYH")); // pstmt = dbConn.prepareStatement(insert.toString()); int fnum = 1; pstmt.setString(fnum++,BKNO); pstmt.setString(fnum++,RPDT); pstmt.setString(fnum++,ZHH); pstmt.setString(fnum++,ZHMC); pstmt.setString(fnum++,KHNBBM); pstmt.setString(fnum++,KHHJRJGBM); pstmt.setString(fnum++,KHHNBJGH); pstmt.setString(fnum++,ZHBZ); pstmt.setString(fnum++,ZHLX); pstmt.setString(fnum++,KHRQ); pstmt.setString(fnum++,XHRQ); pstmt.setString(fnum++,ZHZT); pstmt.setString(fnum++,SFKTWSYH); pstmt.setString(fnum++,SFKTSJYH); pstmt.setString(fnum++,ACST); pstmt.setString(fnum++, "0"); pstmt.setString(fnum++, "1"); // pstmt.executeUpdate(); // pstmt.close(); pstmt.addBatch(); if(!ISNEW.equals("")){//如果空就是增加的,否則是新修改的,對修改的以前的信息上報類型進行修改 StringBuffer updateSQL = new StringBuffer(); updateSQL.append(" UPDATE ").append(tableName).append(" SET SBTY=2 "); updateSQL.append(" WHERE BKNO='").append(BKNO).append("'"); updateSQL.append(" and ZHH='").append(ZHH).append("'"); updateSQL.append(" and CJRQ IN("); updateSQL.append(" SELECT * FROM ( SELECT MAX(CJRQ) FROM ").append(tableName); updateSQL.append(" WHERE BKNO='").append(BKNO).append("'"); updateSQL.append(" and ZHH='").append(ZHH).append("'"); updateSQL.append(" and STAT=1 ) A"); updateSQL.append(" )"); rtcd = JrtjComm.updateSBTY(dbConn, updateSQL.toString()); if(!rtcd.equals("0000")){ return rtcd; } } Map <String ,String>dataMap=new<String ,String> HashMap(); dataMap.put("BKNO",BKNO);/****/ dataMap.put("CJRQ",RPDT);/****/ dataMap.put("ZHH",ZHH); dataMap.put("ZHMC",ZHMC); dataMap.put("KHNBBM",KHNBBM); dataMap.put("KHHJRJGBM",KHHJRJGBM); dataMap.put("KHHNBJGH",KHHNBJGH); dataMap.put("ZHBZ",ZHBZ); dataMap.put("ZHLX",ZHLX); dataMap.put("KHRQ",KHRQ); dataMap.put("XHRQ",XHRQ); dataMap.put("ZHZT",ZHZT); dataMap.put("SFKTWSYH",SFKTWSYH); dataMap.put("SFKTSJYH",SFKTSJYH); dataList.add(dataMap); } pstmt.executeBatch(); long endTime1 = System.currentTimeMillis(); // 獲取結束時間 測試用,生產可注釋 System.out.println("插入JR_ZHXX表程序運行時間:" + (endTime1 - startTime1) + "ms"); // 輸出程序運行時間 測試用,生產可注釋 pstmt.close(); rtcd=JRTJComm.GenFile(dbConn, tableName, BASEVC, RPDT,JRTJPar,dataList); } catch (Exception e) { rtcd="出現異常,交易失敗。"; logger.error("出現異常:",e); }finally{ try{ if (null != stmt) stmt.close(); if (null != rs) rs.close(); if (null != pstmt) pstmt.close(); }catch(Exception e){ } } return rtcd; }
測試比對不使用批量的時間,使用后是20秒以內,多數是17秒左右,沒用批量是3分鍾以上,數據是7000多條。
注意:rewriteBatchedStatements=true 這個加到你的數據庫配置的URL后面。
本人菜雞一個,歡迎大佬們來吐槽和指導。