久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

關(guān)于批量插入數(shù)據(jù)之我見(100萬級別的數(shù)據(jù),mysql)

 Macalist 2017-01-12

因前段時間去面試,,問到如何高效向數(shù)據(jù)庫插入10萬條記錄,,之前沒處理過類似問題,,也沒看過相關(guān)資料,結(jié)果沒答上來,,今天就查了些資料,,總結(jié)出三種方法:

測試數(shù)據(jù)庫為MySQL!!!

方法一:

  1. public static void insert() {  
  2.         // 開時時間  
  3.         Long begin = new Date().getTime();  
  4.         // sql前綴  
  5.         String prefix = "INSERT INTO tb_big_data (count, create_time, random) VALUES ";  
  6.         try {  
  7.             // 保存sql后綴  
  8.             StringBuffer suffix = new StringBuffer();  
  9.             // 設(shè)置事務(wù)為非自動提交  
  10.             conn.setAutoCommit(false);  
  11.             // Statement st = conn.createStatement();  
  12.             // 比起st,pst會更好些  
  13.             PreparedStatement pst = conn.prepareStatement("");  
  14.             // 外層循環(huán),,總提交事務(wù)次數(shù)  
  15.             for (int i = 1; i <= 100; i++) {  
  16.                 // 第次提交步長  
  17.                 for (int j = 1; j <= 10000; j++) {  
  18.                     // 構(gòu)建sql后綴  
  19.                     suffix.append("(" + j * i + ", SYSDATE(), " + i * j  
  20.                             * Math.random() + "),");  
  21.                 }  
  22.                 // 構(gòu)建完整sql  
  23.                 String sql = prefix + suffix.substring(0, suffix.length() - 1);  
  24.                 // 添加執(zhí)行sql  
  25.                 pst.addBatch(sql);  
  26.                 // 執(zhí)行操作  
  27.                 pst.executeBatch();  
  28.                 // 提交事務(wù)  
  29.                 conn.commit();  
  30.                 // 清空上一次添加的數(shù)據(jù)  
  31.                 suffix = new StringBuffer();  
  32.             }  
  33.             // 頭等連接  
  34.             pst.close();  
  35.             conn.close();  
  36.         } catch (SQLException e) {  
  37.             e.printStackTrace();  
  38.         }  
  39.         // 結(jié)束時間  
  40.         Long end = new Date().getTime();  
  41.         // 耗時  
  42.         System.out.println("cast : " + (end - begin) / 1000 + " ms");  
  43.     }  


輸出時間:cast : 23 ms

該方法目前測試是效率最高的方法!




方法二:

  1. public static void insertRelease() {  
  2.         Long begin = new Date().getTime();  
  3.         String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)";  
  4.         try {  
  5.             conn.setAutoCommit(false);  
  6.             PreparedStatement pst = conn.prepareStatement(sql);  
  7.             for (int i = 1; i <= 100; i++) {  
  8.                 for (int k = 1; k <= 10000; k++) {  
  9.                     pst.setLong(1, k * i);  
  10.                     pst.setLong(2, k * i);  
  11.                     pst.addBatch();  
  12.                 }  
  13.                 pst.executeBatch();  
  14.                 conn.commit();  
  15.             }  
  16.             pst.close();  
  17.             conn.close();  
  18.         } catch (SQLException e) {  
  19.             e.printStackTrace();  
  20.         }  
  21.         Long end = new Date().getTime();  
  22.         System.out.println("cast : " + (end - begin) / 1000 + " ms");  
  23.     }  

注:注釋就沒有了,,和上面類同,下面會有分析,!

控制臺輸出:cast : 111 ms

執(zhí)行時間是上面方法的5倍,!



方法三:

  1. public static void insertBigData(SpringBatchHandler sbh) {  
  2.         Long begin = new Date().getTime();  
  3.         JdbcTemplate jdbcTemplate = sbh.getJdbcTemplate();  
  4.         final int count = 10000;  
  5.         String sql = "INSERT INTO tb_big_data (count, create_time, random) VALUES (?, SYSDATE(), ?)";  
  6.         jdbcTemplate.batchUpdate(sql, new BatchPreparedStatementSetter() {  
  7.             // 為prepared statement設(shè)置參數(shù)。這個方法將在整個過程中被調(diào)用的次數(shù)  
  8.             public void setValues(PreparedStatement pst, int i)  
  9.                     throws SQLException {  
  10.                 pst.setLong(1, i);  
  11.                 pst.setInt(2, i);  
  12.             }  
  13.   
  14.             // 返回更新的結(jié)果集條數(shù)  
  15.             public int getBatchSize() {  
  16.                 return count;  
  17.             }  
  18.         });  
  19.         Long end = new Date().getTime();  
  20.         System.out.println("cast : " + (end - begin) / 1000 + " ms");  
  21.     }  

該方法采用的是spring batchUpdate執(zhí)行,,因效率問題,,數(shù)據(jù)量只有1萬條!

執(zhí)行時間:cast : 387 ms





總結(jié):方法一和方法二很類同,,唯一不同的是方法一采用的是“insert into tb (...) values(...),(...)...;”的方式執(zhí)行插入操作,,

方法二則是“insert into tb (...) values (...);insert into tb (...) values (...);...”的方式,要不是測試,我也不知道兩者差別是如此之大,!

當(dāng)然,,這個只是目前的測試,具體執(zhí)行時間和步長也有很大關(guān)系,!如過把步長改為100,,可能方法就要幾分鐘了吧,這個可以自己測試哈,。,。。

方法三網(wǎng)上很推崇,,不過,,效率大家也都看到了,1萬條記錄,,耗時6分鐘,,可見其效率并不理想!而且方法三需要配置spring applicationContext環(huán)境才能應(yīng)用,!

不過,,方法三在ssh/spring-mvc中可用性還是很高的!


剛才開始研究大數(shù)據(jù)方面的問題,,以上也只是真實(shí)測試的結(jié)果,,并不一定就是事實(shí),有好的建議,,大家請指正,,謝謝!

相互學(xué)習(xí),,才能進(jìn)步更快,!


晚點(diǎn)會把源碼發(fā)上來,大家可以直接去下載測試,!

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn),。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多