成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院203nnxyz-美女毛片在线看-美女免费黄

站長資訊網
最全最豐富的資訊網站

java向mysql數據庫批量插入大量數據

java向mysql數據庫批量插入大量數據

首先看下我們的目標:向mysql數據庫中批量插入10000條數據

操作環境:Mysql和Java代碼都運行在我本地Windows電腦(i7處理器,4核,16G運行內存,64位操作系統

1、JPA單線程執行

代碼省略,大概需要39S左右

java向mysql數據庫批量插入大量數據

2、JPA多線程執行

java向mysql數據庫批量插入大量數據

大概需要37S左右,并沒有想象中的快很多

(免費學習視頻分享:java視頻教程)

原因: 多線程只是大大提高了程序處理數據的時間,并不會提高插入數據庫的時間,相反在我這邊JPA的框架下,多線程也就意味著多連接,反而更加消耗數據庫性能

package com.example.demo.controller;  import com.example.demo.entity.Student; import com.example.demo.service.StudentServiceInterface; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;  import javax.xml.bind.ValidationException; import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.concurrent.CountDownLatch; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors;  @RestController @RequestMapping("/student") public class StudentController {      @Autowired     private StudentServiceInterface studentServiceInterface;      // 來使主線程等待線程池中的線程執行完畢     private CountDownLatch threadsSignal;      // 每個線程處理的數據量     private static final int count = 1000;     // 我的電腦為4核 線程池大小設置為2N+1     private static ExecutorService execPool = Executors.newFixedThreadPool(9);          /**      * 多線程保存      *      * @return      * @throws ValidationException      */     @GetMapping()     public String saveStudentEnableThread() throws ValidationException {         Long begin = new Date().getTime();         // 需要插入數據庫的數據         List<Student> list = new ArrayList<>();         for (int i = 0; i < 10000; i++) {             Student student = new Student();             student.setName("張三");             student.setAge(10);             list.add(student);         }         try {             if (list.size() <= count) {                 threadsSignal = new CountDownLatch(1);                 execPool.submit(new InsertDate(list));             } else {                 List<List<Student>> lists = dealData(list, count);                 threadsSignal = new CountDownLatch(lists.size());                 for (List<Student> students : lists) {                     execPool.submit(new InsertDate(students));                 }             }             threadsSignal.await();         } catch (Exception e) {             System.out.println(e.toString() + " 錯誤所在行數:" + e.getStackTrace()[0].getLineNumber());         }         // 結束時間         Long end = new Date().getTime();         return "10000條數據插入花費時間 : " + (end - begin) / 1000 + " s";     }      /**      * 數據組裝      * 把每個線程要處理的數據 再組成一個List      * 我這邊就是把10000條數據 組成 10個1000條的集合      *      * @param target 數據源      * @param size   每個線程處理的數量      * @return      */     public static List<List<Student>> dealData(List<Student> target, int size) {         List<List<Student>> threadList = new ArrayList<List<Student>>();         // 獲取被拆分的數組個數         int arrSize = target.size() % size == 0 ? target.size() / size : target.size() / size + 1;         for (int i = 0; i < arrSize; i++) {             List<Student> students = new ArrayList<Student>();             //把指定索引數據放入到list中             for (int j = i * size; j <= size * (i + 1) - 1; j++) {                 if (j <= target.size() - 1) {                     students.add(target.get(j));                 }             }             threadList.add(students);         }         return threadList;     }      /**      * 內部類,開啟線程批量保存數據      */     class InsertDate extends Thread {         List<Student> list = new ArrayList<Student>();         public InsertDate(List<Student> students) {             list = students;         }         public void run() {             try {                 // 與數據庫交互                 studentServiceInterface.save(list);                 threadsSignal.countDown();             } catch (ValidationException e) {                 e.printStackTrace();             }         }     } }

3、傳統JDBC插入

java向mysql數據庫批量插入大量數據

大概需要8S左右,相較于前兩種方式已經快很多了,代碼如下:

package com.example.demo.controller;  import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;  import javax.xml.bind.ValidationException; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.util.Date;  @RestController @RequestMapping("/student1") public class StudentController1 {      @GetMapping()     public String saveStudentEnableThread() throws ValidationException {         // 開始時間         Long begin = new Date().getTime();         Connection connection = null;         try {             connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/db01?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=UTC&allowPublicKeyRetrieval=true", "admin", "123456");//獲取連接             if (connection != null) {                 System.out.println("獲取連接成功");             } else {                 System.out.println("獲取連接失敗");             }             //這里必須設置為false,我們手動批量提交             connection.setAutoCommit(false);             //這里需要注意,SQL語句的格式必須是預處理的這種,就是values(?,?,...,?),否則批處理不起作用             PreparedStatement statement = connection.prepareStatement("insert into student(id,`name`,age) values(?,?,?)");             // 塞數據             for (int i = 0; i < 10000; i++) {                 statement.setInt(1, i+1);                 statement.setString(2, "張三");                 statement.setInt(3, 10);                 //將要執行的SQL語句先添加進去,不執行                 statement.addBatch();             }             // 提交要執行的批處理,防止 JDBC 執行事務處理             statement.executeBatch();             connection.commit();             // 關閉相關連接             statement.close();             connection.close();         } catch (Exception e) {             e.printStackTrace();         }         // 結束時間         Long end = new Date().getTime();         // 耗時         System.out.println("10000條數據插入花費時間 : " + (end - begin) / 1000 + " s");         return "10000條數據插入花費時間 : " + (end - begin) / 1000 + " s";     }  }

4、最后檢查一下數據是否成功存庫,一共30000條,沒有丟數據

java向mysql數據庫批量插入大量數據

完成!

贊(0)
分享到: 更多 (0)
?
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
久久久久久精品免费免费英国 | 午夜精品久久久久久99热| 婷婷五月18永久免费网站| 无码少妇xxxx| 精品日产1区2卡三卡麻豆| 久久久国产精品一区二区18禁| 乱色熟女综合一区二区三区| 欧美日韩在线亚洲一区蜜芽| 色噜噜人妻av无码| 性色欲情网站IWWW| 一本到在线高清视频| av 无码av 丰满av| 国产AV人人夜夜澡人人爽| 国产自偷在线拍精品热乐播AV| 久久精品亚洲精品无码金尊| 民工把奶头吸得又大又长| 精品人妻一区二区三区| 门徒电影高清完整版在线观看| 黑人入室粗暴人妻中出| 狂躁美女大BBBBBB视频U| 人妻无码一区二区不卡无码AV| 婷婷蜜桃国产精品| 亚洲熟妇无码AV| JAPANESE人妻少妇HD| 国产精品白丝JK白祙喷水视频 | 人妻丝袜AV先锋影音先| 无码 有码 日韩 人妻| 亚洲一本到无码AV中文字幕| 亚洲欧美日韩精品成人| 2019在线人妻中文字幕| 公交车后车座的疯狂的做| 娇妻在卧室里被领导爽电影| 男吃乳尖玩奶头高潮视频| 射精情感曰妓女色视频| 亚洲人妻AV伦理| 菠萝菠萝蜜菠萝菠萝5| 国产在线视欧美亚综合| 女生裙子里面到底穿了啥| 无码超乳爆乳中文字幕久久| 少妇内射一区27p| 亚洲日本乱码在线观看| 成人av在线播放| 精品无码视频一区二区三区| 人伦片无码中文字| 亚洲AV无码专区亚洲猫咪| JAPANESE失禁潮喷| 好儿子妈妈今后就是你的人| 欧美性猛交内射兽交老熟妇| 亚洲AV无码专区在线观看漫画| FREE性丰满HD性欧美| 狠狠色噜噜狠狠狠888米奇视频| 欧美熟妇呻吟猛交XX牲| 亚洲AⅤ永久无码精品毛片| 99品一二三产区区别| 好男人在线观看无遮挡版| 人妻少妇久久中文字幕| 亚洲色成人www在线观看| 丰满少妇被猛烈进入| 国产精品久久久久7777按摩| 蜜桃Av噜噜一区二区三区网址 | 国产无遮挡裸体免费视频在线观看 | 欧美性色欧美A在线播放| 亚洲国产成人久久一区WWW| 亚洲男男GAY 18自慰网站| 办公室被吃奶好爽在线观看| 精品人妻av无码一区二区三区| 日本处ⅩⅩ人╳护士19| 夜夜夜夜猛噜噜噜噜噜试看| 国产黄A三级三级三级| 欧美性大战久久久久久久| 亚洲人成人无码一区二区三区| 粉嫩av一区二区三区四区| 免费无码成人AV片在线在线播放 | 国内国外日产一区二区| 日本插槽X8插槽怎么用的| 永久黄网站色视频免费观看APP| 97国产精华最好的产品有哪些 | 国产精品99久久精品| 欧美成人精品高清视频| 亚洲人成网亚洲欧洲无码久久 | 午夜夫妻试看120国产| 苍井空张开腿实干12次| 国产高清在线精品一区二区三区| 女厕脱裤撒尿大全视频| 亚洲人成网站18禁止无码| 国产精品麻豆欧美日韩WW| 人妻少妇精品无码专区芭乐视网| 野花免费观看日本韩国| 国产在线精品一区二区三区| 色噜噜狠狠色综合无码AV天堂| 69风韵老熟女口爆吞精| 久久精品国产亚洲7777| 性无码免费一区二区三区在线| 床震吃胸膜奶免费视频| 欧美午夜精品久久久久久浪潮| 影音先锋日日狠狠久久| 精品久久久久久中文字幕人妻最新| 无码精品人妻AV一区二区三区| 成人Α片免费视频在线观看| 欧美多人片高潮野外做片黑人| 一本一道久久综合久久| 狠狠躁夜夜躁AV网站色| 久久久久久精品成人免费| 亚洲AV成人一区国产精品小说| 国产97在线 | 日韩| 人人玩人人添人人澡东莞| 99RE6在线视频精品免费下载| 丰满年经的继拇6| 人妻激情乱人伦视频| 91人妻一区二区三区蜜桃精品| 久久露脸国产精品| 亚洲色精品一区二区三区| 狠狠躁夜夜躁人人爽天天不卡软件| 小12国产萝裸体视频福利| 国产福利精品一区二区| 睡美人免费观看完整版西瓜| 永久免费无码AV在线网站| 高潮喷吹一区二区在线观看| 日本熟妇色XXXXX日本老妇 | 欧美性婬爽www视频播放| 2021av在线视频| 乱人伦中文无码视频在线观看| 亚洲综合区小说区激情区| 久久精品人人做人人爽电影蜜月| 亚洲第一无码精品一区| 精品成在人线AV无码免费看| 亚洲国产精品成人精品无码区在线| 国产熟睡乱子伦视频| 亚洲AV成人无码网站大全| 国内AI明星造梦鞠婧祎MV| 亚洲国产AⅤ精品一区二区蜜桃| 狠狠做深爱婷婷综合一区 | 少妇性饥渴VIDEOS| 国产A国产片国产| 挺进邻居漂亮的娇妻| 国产精品美女久久久M| 午夜成人无码片在线观看影院| 国产美女精品视频线免费播放软件| 小荡货奶真大水真多紧视频| 国产亚洲精品线观看K频道| 亚洲国产成人AⅤ毛片奶水| 精品亚洲国产成人AV| 伊人久久大香线蕉亚洲五月天| 麻花传媒CEO免费观看| 7777精品伊久久久大香线蕉| 人曾交互MOUSE农场| 丰满少妇XXXⅩBBBB视频| 无码精品一区二区三区在线 | 日韩视频中文字幕精品偷拍| 一女被两男吃奶玩乳尖| 噜噜狠狠色综合久色AⅤ五区| 37大但文体艺术A级都市天气| 欧洲吸奶大片在线看| 吃奶呻吟打开双腿做受动态图| 四虎国产精品永久在线| 国产亚洲AV人片在线观看| 亚洲乱人伦中文字幕无码| 每个世界都被主角睡来睡去可乐饼| AV无码久久久久不卡网站下载| 日本人妻熟妇BBBBB| 国产精品毛片一区二区三区| 亚洲精品无码少妇30P| 美丽女邻居交换5完整版| 八戒八戒神马影院在线4 | 日韩精品一区二区三区四区蜜桃| 国产成人无码AⅤ片在线观看导航 国产成人无码AⅤ片在线观看 | 免费少妇A级毛片人成网| 部长来家里喝酒日剧叫什么| 无码人妻精品一区二区蜜桃天美| 娇小VIDEOS出血| √最新版天堂资源网在线下载| 日本中文字幕乱码免费| 国产无遮挡18禁无码网站| 在线黄色网站观看汙| 人人婷婷色综合五月第四人色阁| 国产乱妇乱子视频在播放| 亚洲自偷自偷在线成人网站传媒| 欧美人与动欧交视频| 国产成人无码AV在线播放不卡 | 玩丰满少妇XXXXXⅩ性麻| 精品无码中文视频在线观看| AV大片在线无码永久免费网址| 他一边曰一边吃我奶小说免看| 精品厕所偷拍各类美女TP嘘嘘| 99久久精品费精品国产| 为什么放进去女的就老实了| 久久精晶国产99久久6| VODAFONEWIFI巨大黑| 午夜精品久久久久久久久| 乱辈通奷ⅩXXXXHD| 成人午夜亚洲精品无码区| 人妻无码一区二区| 国内揄拍国内精品| 99国产精品久久久蜜芽| 无码不卡AV东京热毛片| 久久无码人妻一区二区三区午夜| 成人国产一区二区三区| 亚洲熟妇AV午夜无码不卡| 日韩精品无码AV中文无码版| 精品久久人人爽人人玩人人妻|