關于批量插入數據之我見(100萬級別的數據,mysql)

2019獨角獸企業重金招聘Python工程師標準>>> hot3.png

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

測試數據庫為mysql!!!

方法一:

?

[java]?view plain?copy

  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. ????????????//?設置事務為非自動提交??
  10. ????????????conn.setAutoCommit(false);??
  11. ????????????//?Statement?st?=?conn.createStatement();??
  12. ????????????//?比起st,pst會更好些??
  13. ????????????PreparedStatement?pst?=?conn.prepareStatement("");??
  14. ????????????//?外層循環,總提交事務次數??
  15. ????????????for?(int?i?=?1;?i?<=?100;?i++)?{??
  16. ????????????????//?第次提交步長??
  17. ????????????????for?(int?j?=?1;?j?<=?10000;?j++)?{??
  18. ????????????????????//?構建sql后綴??
  19. ????????????????????suffix.append("("?+?j?*?i?+?",?SYSDATE(),?"?+?i?*?j??
  20. ????????????????????????????*?Math.random()?+?"),");??
  21. ????????????????}??
  22. ????????????????//?構建完整sql??
  23. ????????????????String?sql?=?prefix?+?suffix.substring(0,?suffix.length()?-?1);??
  24. ????????????????//?添加執行sql??
  25. ????????????????pst.addBatch(sql);??
  26. ????????????????//?執行操作??
  27. ????????????????pst.executeBatch();??
  28. ????????????????//?提交事務??
  29. ????????????????conn.commit();??
  30. ????????????????//?清空上一次添加的數據??
  31. ????????????????suffix?=?new?StringBuffer();??
  32. ????????????}??
  33. ????????????//?頭等連接??
  34. ????????????pst.close();??
  35. ????????????conn.close();??
  36. ????????}?catch?(SQLException?e)?{??
  37. ????????????e.printStackTrace();??
  38. ????????}??
  39. ????????//?結束時間??
  40. ????????Long?end?=?new?Date().getTime();??
  41. ????????//?耗時??
  42. ????????System.out.println("cast?:?"?+?(end?-?begin)?/?1000?+?"?ms");??
  43. ????}??

?

?

輸出時間:cast : 23 ms

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

?

?

?

方法二:

?

[java]?view plain?copy

  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

執行時間是上面方法的5倍!

?

?

方法三:

?

[java]?view plain?copy

  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設置參數。這個方法將在整個過程中被調用的次數??
  8. ????????????public?void?setValues(PreparedStatement?pst,?int?i)??
  9. ????????????????????throws?SQLException?{??
  10. ????????????????pst.setLong(1,?i);??
  11. ????????????????pst.setInt(2,?i);??
  12. ????????????}??
  13. ??
  14. ????????????//?返回更新的結果集條數??
  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執行,因效率問題,數據量只有1萬條!

?

執行時間:cast : 387 ms

?

?

?

?

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

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

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

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

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

?

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

相互學習,才能進步更快!

?

晚點會把源碼發上來,大家可以直接去下載測試!

轉載于:https://my.oschina.net/u/1018004/blog/1571241

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/540291.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/540291.shtml
英文地址,請注明出處:http://en.pswp.cn/news/540291.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

各個OS關于查看磁盤和wwn號的方法

1,HP-UX幾個命令1&#xff09;查看型號&#xff0c;和uname -a差不多model2&#xff09;查看光纖卡信息ioscan -funC fc3) 查看掃描出的磁盤信息ioscan -fucC disk4&#xff09;查看磁盤及其對應的路徑ioscan -m dsf5) 查看劃分過來的lunioscan -m lun6) 查看磁盤大小diskinfo …

[轉載] Java是不是面向對象的程序

參考鏈接&#xff1a; 為什么Java不是純粹的面向對象語言 轉載自&#xff1a;https://blog.csdn.net/a21700790yan/article/details/80129053 Java——是否確實的 “純面向對象”&#xff1f;讓我們深入到Java的世界&#xff0c;試圖來證實它。 在我剛開始學習 Java 的前面幾…

極速理解設計模式系列:6.適配器模式(Adapter Pattern)

四個角色&#xff1a;目標抽象類角色(Target)、目標對象角色(Adapter)、源對象角色(Adaptee)、客戶端角色(Client) 目標抽象類角色&#xff08;Target)&#xff1a;定義需要實現的目標接口 目標對象角色&#xff08;Adapter)&#xff1a;調用另外一個源對象&#xff0c;并且轉換…

[轉載] Java之繼承

參考鏈接&#xff1a; Java多重繼承 Java之繼承 繼承是面向對象程序的一個基本特征&#xff0c;通過繼承可以實現父子關系&#xff0c;以及代碼的復用。通過繼承實現的類稱為子類&#xff0c;被繼承的類稱為父類&#xff0c;所有直接或間接被繼承的類都稱為父類。 Java類體…

Spark(二): 內存管理

2019獨角獸企業重金招聘Python工程師標準>>> Spark 作為一個以擅長內存計算為優勢的計算引擎&#xff0c;內存管理方案是其非常重要的模塊&#xff1b; Spark的內存可以大體歸為兩類&#xff1a;execution和storage&#xff0c;前者包括shuffles、joins、sorts和agg…

[轉載] 手把手教你整合最優雅SSM框架:SpringMVC + Spring + MyBatis

參考鏈接&#xff1a; Java繼承類的對象創建 本文發表于2016年6月&#xff0c;寫于作者學生時期。文中使用到的技術和框架可能不是當下最佳實踐&#xff0c;甚至很不“優雅”。但對于剛接觸JavaEE和Spring的同學來說&#xff0c;還是能有很多收獲的&#xff0c;大牛輕拍 我們…

多播、組播、廣播優缺點分析

2019獨角獸企業重金招聘Python工程師標準>>> 單播、多播和廣播單播”&#xff08;Unicast&#xff09;、“多播”&#xff08;Multicast&#xff09;和“廣播”&#xff08;Broadcast&#xff09;這三個術語都是用來描述網絡節點之間通訊方式的術語。那么這些術語究…

[轉載] Java重載、覆蓋與構造函數

參考鏈接&#xff1a; Java中的繼承和構造函數 /** * 拷貝構造函數---Copyf t2 new Copyf(t1);就不會在調用默認構造函數了。 * 復制clone和引用 * 重載是在同一個類&#xff08;范圍&#xff09;中&#xff0c;覆蓋是子類對父類而言。 重載不關心返回值類型。 靜態方法不能被…

LOFTERD18B542F16FF685FD684F427B4…

2019獨角獸企業重金招聘Python工程師標準>>> 驗證 轉載于:https://my.oschina.net/jinhengyu/blog/1572124

[轉載] Java獲取一個類繼承的父類或者實現的接口的泛型參數

參考鏈接&#xff1a; Java中的接口和繼承 泛型的作用就不多介紹了&#xff0c;如果你想具備架構設計能力&#xff0c;那么熟練使用泛型是必不可少的。 不多說了&#xff0c;先定義泛型父類和泛型接口&#xff1a; package cn.zhh; public class Parent<T1, T2> { …

PHP系列(一)PHP流程控制結構

while(){} do{ }while(); for( 表達式1; 表達式2;表達式3 ){ 語句或語句序列; } if(){} if(){ }elseif{} <?php $i0; while(true) { if($i>100) break; echo ".$i.<br>"; $i; } ?> <?php echo "<table border1800>"; echo &quo…

[轉載] Scala繼承與Java的區別

參考鏈接&#xff1a; Java中將final與繼承一起使用 在之前的筆記Java靜態屬性和方法的繼承問題中&#xff0c;通過具體的實驗證明&#xff0c;在子類中重寫父類的字段時并沒有覆蓋父類的字段&#xff0c;只是隱藏了父類的字段。而在scala中則不同&#xff0c;scala子類的同名…

Source Map調試壓縮后代碼

在前端開發過程中&#xff0c;無論是樣式還是腳本&#xff0c;運行時的文件可能是壓縮后的&#xff0c;那這個時候調試起來就很麻煩。 這個時候&#xff0c;可以使用Source Map文件來優化調試&#xff0c;Source Map是一個信息文件&#xff0c;里面儲存著原代碼位置信息&#x…

[轉載] Python3十大經典錯誤及解決辦法

參考鏈接&#xff1a; Python中的關鍵字2 ◆ ◆ ◆ ◆ ◆ 接觸了很多Python愛好者&#xff0c;有初學者&#xff0c;亦有轉行人。不論大家學習Python的目的是什么&#xff0c;總之&#xff0c;學習Python前期寫出來的代碼不報錯就是極好的。下面&#xff0c;嚴小樣兒為大家羅…

兩臺電腦間大量數據拷貝的快捷方法

可能大家會遇到需要將一臺電腦里的數據拷貝到另外一臺電腦&#xff0c;最常用的方法是用u盤或移動硬盤等存儲設備來拷貝&#xff0c;這樣速度慢&#xff0c;而且可能拷貝多次才能將數據拷貝完。現提供一種方法&#xff0c;就是通過windows 的文件共享來實現。通過千兆網線直接連…

[轉載] 使用 Web 標準生成 ASP.NET 2.0 Web 站點

參考鏈接&#xff1a; 使用super訪問Java祖父母的成員 Stephen WaltherSuperExpert.com 適用于&#xff1a; Microsoft ASP.NET 2.0 (Beta 2) Microsoft Visual Studio .NET 2005 Microsoft Visual Web Developer 摘要&#xff1a; Microsoft ASP.NET 2.0 具有很多有用的功能…

Office快捷鍵大全之三(Access快捷鍵下篇)

向下鍵 向某幫助主題的末尾滾動 Page Up 以較大增量向某幫助主題的開頭滾動 Page Down 以較大增量向某幫助主題的末尾滾動 Home 移到某幫助主題的開頭 End 移到某幫助主題的末尾 CtrlP 打印當前幫助主題 CtrlA 選定整個幫助主題 CtrlC 將選定項復制到"剪貼…

[轉載] 如何在Android設備之間共享Google Play應用,音樂等

參考鏈接&#xff1a; 使用super訪問Java祖父母的成員 We recently showed you how to configure your iOS devices for app and media sharing; more than a few people wrote in asking how to do the same thing with Google Play purchases. Read on as we dig into how t…

linux 高性能讀書筆記之通用socket地址

####socket網絡編程接口 socket的地址是結構體sockaddr 代碼如下 struct sockaddr{ sa_family_t sa_family; char sa_data[14]; } sa_family 成員是地址族類型&#xff08;sa_family_t)變量。地址族類型通常與協議族類型對應 1.二者對應表 協議族地址表描述PF_UNIXAF_UNIXUNIX本…

[轉載] JAVA面向對象之代碼塊 繼承 方法的重寫 super關鍵字與重寫toString()方法介紹

參考鏈接&#xff1a; 可以重寫Java中的私有方法嗎 JAVA面向對象之代碼塊與繼承 代碼塊分類 局部代碼塊 作用:限制變量生命周期 書寫位置:在方法中 構造代碼塊 開發中很少使用 書寫位置:類中 方法外 調用時機:如果你有構造代碼塊 系統會幫你調用 幫你在創建對象…