发表于: 2020-06-18 23:31:00
1 1590
今天做了什么
1.用jdbc+多线程往数据库插入3000W数据测试有无索引的速度。
2.往服务器安装jdk(成功),maven(未完成),mysql(未完成)。
线程类:
private PreparedStatement preparedStatement = null;
private Connection connection = null;
public void run() {
Student student = new Student();
student.setSchool("贵航");
student.setName("韦延伦");
student.setType("java");
student.setStudentNumber("6601");
student.setSlogan("好好学习天天向上");
student.setEnterTime("20200605");
student.setLogLink("www.baidu.com");
student.setBrother("辅导师兄");
student.setQqNumber("939070310");
long start = System.currentTimeMillis();
String sql = "insert into student_task1" +
"(student_name,enter_time,student_number,qq,school,study_type,log_link,slogan,brother) " +
"values(?,?,?,?,?,?,?,?,?)";
try {
connection = DbUtil.getConnection();
preparedStatement = connection.prepareStatement(sql);
//设置为手动提交
connection.setAutoCommit(false);
//每次提交10万一共提交30次
for (int i = 0; i < 30; i++) {
for (int j = 0; j < 100000; j++) {
preparedStatement.setString(1, student.getName());
preparedStatement.setString(2, student.getEnterTime());
preparedStatement.setString(3, student.getStudentNumber());
preparedStatement.setString(4, student.getQqNumber());
preparedStatement.setString(5, student.getSchool());
preparedStatement.setString(6, student.getType());
preparedStatement.setString(7, student.getLogLink());
preparedStatement.setString(8, student.getSlogan());
preparedStatement.setString(9, student.getBrother());
preparedStatement.addBatch();
}
//够十万就提交一次
preparedStatement.executeBatch();
//清空Batch
preparedStatement.clearBatch();
connection.commit();
}
//如果这个线程已经执行完上面的语句就中断线程
Thread.interrupted();
long end = System.currentTimeMillis();
System.out.println("插入300万数据用了" + (end - start) / 1000 + "秒");
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
preparedStatement.close();
connection.close();
} catch (SQLException throwables) {
t hrowables.printStackTrace();
}
}
}
打开十个线程一起插入
public static void main(String[] args) {
TestInsertData t1 = new TestInsertData();
TestInsertData t2 = new TestInsertData();
TestInsertData t3 = new TestInsertData();
TestInsertData t4 = new TestInsertData();
TestInsertData t5 = new TestInsertData();
TestInsertData t6 = new TestInsertData();
TestInsertData t7 = new TestInsertData();
TestInsertData t8 = new TestInsertData();
TestInsertData t9 = new TestInsertData();
TestInsertData t10 = new TestInsertData();
t1.start();
t2.start();
t3.start();
t4.start();
t5.start();
t6.start();
t7.start();
t8.start();
t9.start();
t10.start();
}
结果
无索引3000w 添加的学生姓名索引3000W
3162秒 3238秒
在有索引的情况下,做插入操作要保护索引,所以插得比较慢。
明天的计划:
1.部署远程DB,在服务器上跑一下代码。
2.写任务一的深度思考。
遇到的问题:
1.在linux下配置jdk环境不成功。
解决办法:
通过百度搜到一个详细教程
1.vim /etc/profile
2.一定要大写G回车到最后一行.
3.小写i+回车可以在最后一行插入解压后的jdk所在的文件目录
4.把鼠标移动到光标之外按ESC键
5. :+wq保存退出
6.source /etc/profile使配置生效
7:java -version 查看安装成功情况
2.用mybatis插入数据太慢,配合多线程还是很慢。
解决方法:通过百度搜索,使用原生jdbc+多线程插入数据更快,因为mybatis封装了太多层,要解析很多东西导致很慢。
收获
原生jdbc配合多线程插入千万级是真的比mybatis批量插入快多了。
在linux上安装jdk的方法
评论