当前位置:   article > 正文

Java怎么实现几十万条同时数据插入(三种基本方法测试)_java批量insert

java批量insert

目录

1,使用批量插入

 2,使用多线程

3,使用存储过程


在Java中实现插入几十万条数据,有多种方法可以使用。以下是其中的几种:

1,使用批量插入

使用批量插入可以有效地提高插入速度。下面是一个示例代码:

  1. Connection conn = null;
  2. PreparedStatement ps = null;
  3. try {
  4. conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
  5. conn.setAutoCommit(false);
  6. String sql = "INSERT INTO mytable (name, age, email) VALUES (?, ?, ?)";
  7. ps = conn.prepareStatement(sql);
  8. for (int i = 0; i < data.size(); i++) {
  9. ps.setString(1, data.get(i).getName());
  10. ps.setInt(2, data.get(i).getAge());
  11. ps.setString(3, data.get(i).getEmail());
  12. ps.addBatch();
  13. if ((i + 1) % 1000 == 0) { //1000条数据执行一次批量插入
  14. ps.executeBatch();
  15. conn.commit();
  16. }
  17. }
  18. ps.executeBatch();
  19. conn.commit();
  20. } catch (SQLException e) {
  21. e.printStackTrace();
  22. } finally {
  23. if (ps != null) {
  24. try {
  25. ps.close();
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. if (conn != null) {
  31. try {
  32. conn.close();
  33. } catch (SQLException e) {
  34. e.printStackTrace();
  35. }
  36. }
  37. }

 2,使用多线程

使用多线程可以将数据分为多个部分并行插入,提高效率。以下是一个示例代码

  1. final int THREAD_COUNT = 10; // 线程数
  2. final int BATCH_SIZE = data.size() / THREAD_COUNT; // 每个线程处理的数据量
  3. ExecutorService executor = Executors.newFixedThreadPool(THREAD_COUNT);
  4. for (int i = 0; i < THREAD_COUNT; i++) {
  5. final int startIndex = i * BATCH_SIZE;
  6. final int endIndex = (i + 1) * BATCH_SIZE;
  7. executor.submit(new Runnable() {
  8. public void run() {
  9. Connection conn = null;
  10. PreparedStatement ps = null;
  11. try {
  12. conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
  13. conn.setAutoCommit(false);
  14. String sql = "INSERT INTO mytable (name, age, email) VALUES (?, ?, ?)";
  15. ps = conn.prepareStatement(sql);
  16. for (int j = startIndex; j < endIndex; j++) {
  17. ps.setString(1, data.get(j).getName());
  18. ps.setInt(2, data.get(j).getAge());
  19. ps.setString(3, data.get(j).getEmail());
  20. ps.executeUpdate();
  21. }
  22. conn.commit();
  23. } catch (SQLException e) {
  24. e.printStackTrace();
  25. } finally {
  26. if (ps != null) {
  27. try {
  28. ps.close();
  29. } catch (SQLException e) {
  30. e.printStackTrace();
  31. }
  32. }
  33. if (conn != null) {
  34. try {
  35. conn.close();
  36. } catch (SQLException e) {
  37. e.printStackTrace();
  38. }
  39. }
  40. }
  41. }
  42. });
  43. }
  44. executor.shutdown();
  45. while (!executor.isTerminated()) {} // 等待所有线程完成任务

3,使用存储过程

使用存储过程可以将多个SQL操作合并为一个操作,减少通信开销。以下是一个示例代码:

  1. Connection conn = null;
  2. CallableStatement cs = null;
  3. try {
  4. conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/mydatabase", "root", "password");
  5. String sql = "{CALL insert_data(?, ?, ?)}"; // 存储过程
  6. cs = conn.prepareCall(sql);
  7. for (int i = 0; i < data.size(); i++) {
  8. cs.setString(1, data.get(i).getName());
  9. cs.setInt(2, data.get(i).getAge());
  10. cs.setString(3, data.get(i).getEmail());
  11. cs.executeUpdate();
  12. }
  13. } catch (SQLException e) {
  14. e.printStackTrace();
  15. } finally {
  16. if (cs != null) {
  17. try {
  18. cs.close();
  19. } catch (SQLException e) {
  20. e.printStackTrace();
  21. }
  22. }
  23. if (conn != null) {
  24. try {
  25. conn.close();
  26. } catch (SQLException e) {
  27. e.printStackTrace();
  28. }
  29. }
  30. }

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/450377
推荐阅读
相关标签
  

闽ICP备14008679号