文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

使用java怎么向mysql数据库批量插入数据

2023-06-14 22:53

关注

今天就跟大家聊聊有关使用java怎么向mysql数据库批量插入数据,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

Java可以用来干什么

Java主要应用于:1. web开发;2. Android开发;3. 客户端开发;4. 网页开发;5. 企业级应用开发;6. Java大数据开发;7.游戏开发等。

JPA单线程执行

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

使用java怎么向mysql数据库批量插入数据

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);            @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";    }        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();            }        }    }}

传统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";    }}

最后检查一下数据是否成功存库,一共30000条,没有丢数据

使用java怎么向mysql数据库批量插入数据

看完上述内容,你们对使用java怎么向mysql数据库批量插入数据有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯