发表于: 2020-06-09 10:58:33
4 1428
今日作为:
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的相关工具
评论