Java バッチが大量のデータを mysql データベースに挿入します
まず目標を見てみましょう: mysql データベースに 10,000 個のデータをバッチ挿入する
動作環境: Mysql と Java コードは両方ともローカルの Windows コンピューターで実行されています(i7 プロセッサ、4 コア、16G 実行メモリ、64 ビット オペレーティング システム
1。JPA シングルスレッド実行
コード省略、約 39S
2. JPA マルチスレッドの実行
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); /** * 多线程保存 * * @return * @throws ValidationException */ @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"; } /** * 数据组装 * 把每个线程要处理的数据 再组成一个List * 我这边就是把10000条数据 组成 10个1000条的集合 * * @param target 数据源 * @param size 每个线程处理的数量 * @return */ 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(); } } } }
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"; } }
以上がJava バッチが大量のデータを mysql データベースに挿入しますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック

Java 8は、Stream APIを導入し、データ収集を処理する強力で表現力のある方法を提供します。ただし、ストリームを使用する際の一般的な質問は次のとおりです。 従来のループにより、早期の中断やリターンが可能になりますが、StreamのForeachメソッドはこの方法を直接サポートしていません。この記事では、理由を説明し、ストリーム処理システムに早期終了を実装するための代替方法を調査します。 さらに読み取り:JavaストリームAPIの改善 ストリームを理解してください Foreachメソッドは、ストリーム内の各要素で1つの操作を実行する端末操作です。その設計意図はです

PHPがMySQLに接続した後、ページは空白になり、DIE()関数が失敗する理由。 PHPとMySQLデータベースの間の接続を学習するとき、あなたはしばしばいくつかの混乱することに遭遇します...

Spring Bootは、Java開発に革命をもたらす堅牢でスケーラブルな、生産対応のJavaアプリケーションの作成を簡素化します。 スプリングエコシステムに固有の「構成に関する慣習」アプローチは、手動のセットアップを最小化します。

多くのウェブサイト開発者は、ランプアーキテクチャの下でnode.jsまたはPythonサービスを統合する問題に直面しています:既存のランプ(Linux Apache MySQL PHP)アーキテクチャWebサイトのニーズ...

PCとモバイル側で同じページを共有し、キャッシュの問題を処理する方法は? Nginxでは、Baotaの背景を使用して構築されたPHP MySQL環境、PCサイドの作成方法と...

この記事のPHPの楽観的ロックおよびトランザクションと組み合わせて残高を控除する問題の詳細な説明では、PHP、楽観的ロック、データベーストランザクションのみを使用したバランス控除を詳細に分析します...

このガイドでは、2つのアレイリストを比較するためのいくつかのJavaメソッドを調査します。 比較を成功させるには、両方のリストが同じサイズを持ち、同一の要素を含む必要があります。 JavaのArrayListsを比較する方法 ARを比較するためのいくつかのアプローチが存在します
