发表于: 2020-06-09 10:58:33

4 1430


今日作为:



                  1.根据师兄的建议我先用SQL语句+for循环一条一条的插入100W条数据

                     然后再用Mybatis的批量添加做对比区别很明显



                    时间:单次插入100W数据用了快3个小时才46W数据左右,很慢                     ×

                              

                              批量插入只用了6分钟左右                                                                       


                    


                    内存:单次插入的内存占用大概就700MB左右而已                                                     


                             批量插入的内存占用在生成内含100W条数据的时候占用大概7G                   ×



         CPU:单次插入的处理器占用大概13%左右                                                                               

 

                         批量插入的处理器占用25%左右,在生成100W条数据时最高,批量插入时降低了一些    ×



              而且循环单条插入数据的磁盘占用贼高!

                             




单条插入:

@Test
public void insertall() throws Exception {
SqlSession sqlSession = MybatisUtil.getSeesion();
   Student student = new Student();

   student.setName("无敌");
   student.setSchool("矮子");
   student.setOnline_un("天上");
   student.setNumber(788);
   student.setCity("跑路");
   Integer rows = 0;
   for(int i = 0; i <= 1000000;i++) {
rows = rows +sqlSession.insert("com.jnshu.dao.StudentMapper.insert", student);
       sqlSession.commit();
   }

if (rows > 0) {
System.out.println("添加数据" + rows + "");
   } else {
System.out.println("添加数据失败");
   }

sqlSession.close();
}


看了一下2h50m左右才插入条数据。。。。。取消了 效率好低啊



批量插入:

@Test
public void insertall_forEach() throws Exception{
SqlSession sqlSession = MybatisUtil.getSeesion();
   List<Student> user = new ArrayList<Student>();
   Integer rows = 0;
   for(int i = 0 ; i <= 1000000 ; i++){
Student student = new Student();
       student.setName("无敌");
       student.setSchool("矮子");
       student.setOnline_un("天上");
       student.setNumber(788);
       student.setCity("跑路");
       user.add(student);
   }

rows = sqlSession.insert("com.jnshu.dao.StudentMapper.insertall",user);
   sqlSession.commit();
   sqlSession.close();

}




数据库挂了N次 终于解决了上面的错误

5分钟左右。。。。。。。。                                 牛皮!


Packet for query is too large


在批量插入时会遇见这个错误,因为Mysql默认最大4M,你需要去修改


    特别注意不要信网上的去修改如图所示的配置文件,我TMD一下午被坑了5次,重装数据库第6次的时候才反应过来不对!!!!!!!!!!!!






以下是步骤:


1.在mysql 命令行中运行

set global max_allowed_packet = 200*1024*1024;     //200MB大小够用了


2.重启数据库

net stop mysql80   //我是8.20的

net start mysql80  


3.在mysql命令行中查看是否修改成功


show VARIABLES like '%max_allowed_packet%';

                                                                                //看max_allowed_packet的值变了没有




还完成了      使得Log4j来记录日志

                    访问数据的时候使用Try/Catch捕获异常,关闭DB之后测试异常代码可以正确执行






今日疑惑:为什么两个添加数据的脚本时间差的这么多?又不是多线程,而且都是添加数据呀

                  第一种单次插入的方法用多线程能快些么?因为用的连接池里面有很多数据库连接能用啊!!!

                  

                                          请教一下师兄!!!!!




明天的计划:1.复习一下任务1的相关知识和JAVA基础大概两天吧

                      2.先了解一下任务2的相关工具

                      






返回列表 返回列表
评论

    分享到