成人怡红院-成人怡红院视频在线观看-成人影视大全-成人影院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號
久久精品人人做人人爽97| 色综合视频一区中文字幕| 啊灬啊灬啊灬快高潮了网站 | 午夜无码性爽快影院6080| 后入内射国产一区二区| 亚洲综合色婷婷七月丁香| 欧美交换配乱婬粗大| 国产成人AV一区二区三区在线观| 亚洲AV无码久久久久网站蜜桃| 久久五月精品中文字幕| 插花弄玉曲径通幽| 亚洲AV无码国产在丝袜线观看| 久久亚洲AV成人无码软件| 成年轻人电影免费 视频| 亚洲成AⅤ人在线观看无码| 麻花传媒MD0076沈芯语在线| 丁香花在线影院观看在线播放| 亚洲AV中文无码4区| 欧美视频一区二区图文| 国产午夜精华无码网站| 99久久综合狠狠综合久久止| 亚洲AV成人无码www在线观看| 免费无码不卡视频在线观看| 国产女主播喷水视频在线观看| 真人荫道口图片100张 | 国产精品免费看久久久| 无码人妻精品一区二区蜜桃网站| 特级西西WWW.444人体聚色| 久久婷婷成人综合色综合| А√天堂BT中文在线| 亚洲欧美日本中文字不卡| 内射爽无广熟女亚洲| 当着老公的面被别人欺负该怎么办| 艳妇臀荡乳欲伦交换H漫画小说| 欧洲-级毛片内射| 日本农村大姐RAPPER| 亚洲AV中文无码字幕色三| 99国产精品久久久久久久成人| 国产精品VIDEOSSEX久久发布| 巨爆乳寡妇中文在线观看| 免费人成网WW555| 极品少妇被黑人白浆直流| FREE性满足HD| 亚洲AV成人影视在线观看| 美国MACBOOKPRO日本| 久久99精品久久久久久青青| HENNESSY女RAPPER| 亚洲AⅤ精品无码一区二区嫖妓| 欧美精品V欧洲精品| 久久久久久妓女精品影院 | 成人国产一区二区三区精品不卡| 亚洲精品在看在线观看| 四季AV一区二区三区免费观看| 蜜臀av一区二区三区人妻| 美国6一12呦女精品| 免费人妻AV无码专区| 久久久久精品国产AV麻豆 | 亚洲AV成人精品网站在线播放| 无码专区人妻系列日韩精品少妇 | 亚洲国产AV玩弄放荡人妇| 午夜成人影片在线观看免费完整高| 熟妇人妻av无码一区二区三区| 日日摸日日碰夜夜爽无| 天堂资源在线官网BT| 无人区码一码二码三码在线| 无码纯肉视频在线观看| 三个人换着躁B一PL| 色视频WWW在线播放国产人成| 欧美成人精品高清视频在线观看| 蜜臀av色欲一区二区三区麻豆| 女人毛毛扒开自慰| 92国产精品午夜福利免费| 啊灬啊灬啊灬啊灬高潮了| 国产精品美女久久久免费| 精品伊人久久大线蕉色首页 | 中年人妻丰满AV无码久久不卡| 成人性色生活片免费看爆迷你| 国产又猛又黄又爽| 免费A级毛片无码视频| 四季亚洲AV无码一区在线观看 | 国产精品美女久久久免费| А√天堂资源地址在线官网BT| YY影院电视剧大全| 厨房掀起少妇裙子挺进去| 国产精品国产高清国产AV| 精品国产自在现线看久久| 奶头被民工们吸得又红又肿怎么办| 人妻无码熟妇乱又伦精品视频| 天堂AV无码一区二区三区| 亚洲AV无码专区在线电影成人网| 在线天堂8高清版在线观看| 成人Av在线播放| 孩交乱子XXXX高清影视| 免费一区二区三区成人免费视频| 日本亚洲欧美一区二区麻豆| 亚洲成亚洲乱码一二三四区软件| 真实国产乱子伦沙发睡午觉 | 日产精品卡二卡三卡四妈妈的朋友 | 99国内精品久久久久影院| 国产成人精品久久| 浪货趴办公桌~H揉| 熟女熟妇伦AV网站| 亚洲色欲色欲综合网站| 成片人卡1卡2卡3手机免费看| 精品国产乱子伦一区二区三区| 人妻无码人妻有码中文字幕| 亚洲乱码日产精品BD在线下载| 777ZYZ玖玖资源站最稳定网| 国产啪精品视频网站免费尤物| 欧美VPSWINDOWS另类| 性色av蜜臀av色欲av免费| A级毛片毛片免费观看丝瓜 | 人妻av无码一区二区| 亚洲图片小说激情综合| 国产精品高潮呻吟AV久久动漫| 男生女生一起相差差差| 亚洲精品无码成人片| 国产精品久久自在自线| 欧美在线视频一区二区三区| 亚洲中文字幕乱码电影| 国产精品久久久久久久久久免费 | 98在线视频噜噜噜国产| 精品浪潮av一区二区三区| 天天爽夜夜爽夜夜爽| 曰本女人牲交全视频播放毛片| 和岳每晚弄的高潮嗷嗷叫| 婷婷综合缴情亚洲狠狠| 成人免费看WWW网址入口| 女人自熨全过程视频免费| 一本无码中文字幕在线观| 国语自产偷拍精品视频偷| 无码任你躁久久久久久老妇| 厨房丝袜麻麻被进进出出| 欧美黑人又大又粗XXXXX| 又小又紧女MAGNET| 久久婷婷五月综合97色直播| 亚洲AV无码一区二区密桃精品| 国产精品一亚洲AV日韩AV欧| 日日噜噜夜夜狠狠视频无码| 成人区人妻精品一区二区三区 | 19部MACBOOKPRO日本| 免费AV一区二区三区无码| 亚洲色自偷自拍另类小说| 久久久久久久精品免费老鸭窝| 亚洲永久无码3D动漫一区| 精品无码国产自产拍在线观看| 亚洲精品乱码久久久久久蜜桃图片| 国产色视频一区二区三区QQ号| 性色ΑV一二三天美传媒| 果冻传媒免费观看4399飘雪| 亚洲AV无码AV在线播放| 韩漫漫画在线观看页面免费漫画入| 亚洲AV无码一区东京热久久| 精品乱子伦一区二区三区| 亚洲最新无码中文字幕久久| 久久偷看各类WC女厕嘘嘘偷窃| A∨变态另类天堂无码专区| 人妻熟妇乱又伦精品视频无广告| 大伊香蕉在线精品视频75 | 伊人色综合一区二区三区影院视频| 免费三级现频在线观看免费 | 秘密列车在线全集免费观看| chinese炮打老熟女| 人妻有码中文字幕在线| 国产麻豆精品一区| 轻点灬大JI巴太粗太长了| 国产成人三级在线视频网站观看| 亚洲MV国产MV在线MV综合试| 美女露 0的奶头无| 无人区码一码二码三码是什么| 精品国产乱码久久久久久浪潮| 18禁超污无遮挡无码免费动态图 | 日韩免费A级毛片无码A∨| 18禁裸乳啪啪无遮裆网站| 日韩一区二区三区无码人妻视频| 亚洲AV无码成人精品区天堂| 精品人妻一区二区三区视频| 日本乱人伦AⅤ精品| 国产精品一区二区久久| 再深点灬舒服灬太大了添A | 亚洲精品成人无码中文毛片不卡| 欧美国产SE综合| 国语做受对白XXXXmp4| H无码精品动漫在线观看导航| 性色AV无码专区一ⅤA亚洲 | 无码熟妇人妻Av又大又粗又爽| 麻豆AV无码精品一区二区| 国产精品成人影院久久久| 99久久久成人国产精品免费| 国产未成女一区二区三区| 亚洲人成电影在线观看天堂色| 免费人成网WW555| 韩国日本三级在线观看| 成人奭片免费观看| 最新中文字幕AV专区| 亚洲成AⅤ人的天堂在线观看女人| 日韩A片无码ⅩXXXX| 久久久国产精品VA麻豆| 国产午夜理论片不卡在线观看 | 夫妻二人体验交换夫妻的后果|