国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison Java Javacommencer Le lot Java insère de grandes quantités de données dans la base de données MySQL

Le lot Java insère de grandes quantités de données dans la base de données MySQL

May 01, 2021 pm 12:00 PM
java mysql données

Le lot Java insère de grandes quantités de données dans la base de données MySQL

Tout d'abord, jetons un coup d'?il à notre objectif?: insérer par lots 10 000 éléments de données dans la base de données mysql

Environnement d'exploitation?: le code Mysql et Java s'exécutent tous deux sur mon ordinateur Windows local (processeur i7, 4 c?urs, 16 Go de mémoire en cours d'exécution, système d'exploitation 64 bits

1. Exécution JPA monothread

Code omis, prend environ 39S

Le lot Java insère de grandes quantités de données dans la base de données MySQL

2. Exécution multithread JPA

Le lot Java insère de grandes quantités de données dans la base de données MySQL

Cela prend environ 37S, ce qui n'est pas beaucoup plus rapide que prévu

( Partage de vidéos d'apprentissage gratuit?:Tutoriel vidéo Java)

Raison?: Le multithreading ne fait qu'améliorer considérablement le temps nécessaire au programme pour traiter les données, mais n'augmente pas le temps d'insertion dans la base de données. Au contraire, dans le cadre de JPA ici, le multi-threading Cela signifie que plusieurs connexions consomment plus de performances de base de données

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;

    // 來(lái)使主線程等待線程池中的線程執(zhí)行完畢
    private CountDownLatch threadsSignal;

    // 每個(gè)線程處理的數(shù)據(jù)量
    private static final int count = 1000;
    // 我的電腦為4核 線程池大小設(shè)置為2N+1
    private static ExecutorService execPool = Executors.newFixedThreadPool(9);
    
    /**
     * 多線程保存
     *
     * @return
     * @throws ValidationException
     */
    @GetMapping()
    public String saveStudentEnableThread() throws ValidationException {
        Long begin = new Date().getTime();
        // 需要插入數(shù)據(jù)庫(kù)的數(shù)據(jù)
        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() + " 錯(cuò)誤所在行數(shù):" + e.getStackTrace()[0].getLineNumber());
        }
        // 結(jié)束時(shí)間
        Long end = new Date().getTime();
        return "10000條數(shù)據(jù)插入花費(fèi)時(shí)間 : " + (end - begin) / 1000 + " s";
    }

    /**
     * 數(shù)據(jù)組裝
     * 把每個(gè)線程要處理的數(shù)據(jù) 再組成一個(gè)List
     * 我這邊就是把10000條數(shù)據(jù) 組成 10個(gè)1000條的集合
     *
     * @param target 數(shù)據(jù)源
     * @param size   每個(gè)線程處理的數(shù)量
     * @return
     */
    public static List<List<Student>> dealData(List<Student> target, int size) {
        List<List<Student>> threadList = new ArrayList<List<Student>>();
        // 獲取被拆分的數(shù)組個(gè)數(shù)
        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>();
            //把指定索引數(shù)據(jù)放入到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;
    }

    /**
     * 內(nèi)部類,開啟線程批量保存數(shù)據(jù)
     */
    class InsertDate extends Thread {
        List<Student> list = new ArrayList<Student>();
        public InsertDate(List<Student> students) {
            list = students;
        }
        public void run() {
            try {
                // 與數(shù)據(jù)庫(kù)交互
                studentServiceInterface.save(list);
                threadsSignal.countDown();
            } catch (ValidationException e) {
                e.printStackTrace();
            }
        }
    }
}

3 Insertion JDBC traditionnelle

Le lot Java insère de grandes quantités de données dans la base de données MySQL

. prend environ 8S, par rapport aux deux premiers. La méthode est beaucoup plus rapide. Le code est le suivant :

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 {
        // 開始時(shí)間
        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("獲取連接失敗");
            }
            //這里必須設(shè)置為false,我們手動(dòng)批量提交
            connection.setAutoCommit(false);
            //這里需要注意,SQL語(yǔ)句的格式必須是預(yù)處理的這種,就是values(?,?,...,?),否則批處理不起作用
            PreparedStatement statement = connection.prepareStatement("insert into student(id,`name`,age) values(?,?,?)");
            // 塞數(shù)據(jù)
            for (int i = 0; i < 10000; i++) {
                statement.setInt(1, i+1);
                statement.setString(2, "張三");
                statement.setInt(3, 10);
                //將要執(zhí)行的SQL語(yǔ)句先添加進(jìn)去,不執(zhí)行
                statement.addBatch();
            }
            // 提交要執(zhí)行的批處理,防止 JDBC 執(zhí)行事務(wù)處理
            statement.executeBatch();
            connection.commit();
            // 關(guān)閉相關(guān)連接
            statement.close();
            connection.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
        // 結(jié)束時(shí)間
        Long end = new Date().getTime();
        // 耗時(shí)
        System.out.println("10000條數(shù)據(jù)插入花費(fèi)時(shí)間 : " + (end - begin) / 1000 + " s");
        return "10000條數(shù)據(jù)插入花費(fèi)時(shí)間 : " + (end - begin) / 1000 + " s";
    }

}

4 Enfin, vérifiez si les données ont été stockées avec succès dans la base de données. Il y a 30 000 éléments au total. et aucune donnée n'est perdue

Le lot Java insère de grandes quantités de données dans la base de données MySQL

Terminé !

Recommandations associées?: Tutoriel d'introduction à Java

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefa?on, veuillez contacter admin@php.cn

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover

AI Clothes Remover

Outil d'IA en ligne pour supprimer les vêtements des photos.

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds

Tutoriel PHP
1502
276
Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Aug 04, 2025 pm 12:48 PM

Pré-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusofperforming lightbetterine scénarios.

Comparaison des outils de construction Java: Maven vs Gradle Comparaison des outils de construction Java: Maven vs Gradle Aug 03, 2025 pm 01:36 PM

GradleisthebetterChoiceFormostNewProjectsDuetOtsSuperiorflexibility, Performance et ModerNtoolingSupport.1.gradle’sgroovy / kotlindslismoreConcis

Les touches de volume sur le clavier ne fonctionnent pas Les touches de volume sur le clavier ne fonctionnent pas Aug 05, 2025 pm 01:54 PM

Tout d'abord, CheckifThefnKeySettingisInterferingyTryingBothThevolumeKeyAlonEndfn volumeKey, thentogglefnlockwithfn espifavailable.2.enterbios / uefidUringbootAnableFunctionKeysordiSablehotKeyModetoenSureVolumeSarereCognined.3.updateorreinstallAdriodriving

Comment comparer deux cha?nes à Java? Comment comparer deux cha?nes à Java? Aug 04, 2025 am 11:03 AM

Utilisez la méthode .equals () pour comparer le contenu de la cha?ne, car == ne compare les références d'objet plut?t que le contenu; 1. Utilisez .equals () pour comparer également les valeurs de cha?ne; 2. Utiliser .EqualSignoreCase () pour comparer l'ignorance du cas; 3. Utilisez .Compareto () pour comparer les cha?nes dans l'ordre du dictionnaire, renvoyant 0, nombres négatifs ou positifs; 4. Utiliser .CompareToIgnoreCase () pour comparer le cas Ignorer; 5. Utilisez des objets.equals () ou de la méthode d'appel s?r pour traiter les cha?nes nulles pour éviter les exceptions de pointeur nul. En bref, vous devez éviter d'utiliser == pour les comparaisons de contenu de cha?ne, sauf s'il est explicitement nécessaire de vérifier si l'objet est en phase.

Propriétés calculées vs méthodes en Vue Propriétés calculées vs méthodes en Vue Aug 05, 2025 am 05:21 AM

Calculé a un cache et les accès multiples ne sont pas recalculés lorsque la dépendance reste inchangée, tandis que les méthodes sont exécutées à chaque fois qu'elles sont appelées; 2.COMPUT est adapté aux calculs basés sur des données réactives. Les méthodes conviennent aux scénarios où les paramètres sont requis ou les appels fréquents, mais le résultat ne dépend pas de données réactives; 3.Coupation prend en charge les getters et les setters, ce qui peut réaliser la synchronisation bidirectionnelle des données, mais les méthodes ne sont pas prises en charge; 4. Résumé: Utilisez d'abord calculé pour améliorer les performances et utilisez des méthodes lors de la réussite des paramètres, de l'exécution d'opérations ou d'éviter le cache, en suivant le principe de "Si vous pouvez utiliser calculé, vous n'utilisez pas de méthodes".

Python Logging to File Exemple Python Logging to File Exemple Aug 04, 2025 pm 01:37 PM

Le module de journalisation de Python peut écrire des journaux dans les fichiers via FileHandler. Tout d'abord, appelez le processeur et format de fichier de configuration BasicConfig, tels que la définition du niveau sur les informations, en utilisant FileHandler pour écrire app.log; Deuxièmement, ajoutez StreamHandler pour atteindre la sortie à la console en même temps; Les scénarios avancés peuvent utiliser TimeRotingFileHandler pour diviser les journaux par le temps, par exemple, définir quand = 'Midnight' pour générer de nouveaux fichiers chaque jour et conserver 7 jours de sauvegarde, et assurez-vous que le répertoire de journal existe; Il est recommandé d'utiliser GetLogger (__ Name__) pour créer des journalistes nommés et produire

Comment rejoindre un éventail de cha?nes à Java? Comment rejoindre un éventail de cha?nes à Java? Aug 04, 2025 pm 12:55 PM

L'utilisation de String.join () (Java8) est la méthode recommandée la plus simple pour connecter les tableaux de cha?ne, spécifiez simplement le séparateur directement; 2. Pour les anciennes versions de Java ou lorsque plus de contr?le est nécessaire, vous pouvez utiliser StringBuilder pour traverser et épisser manuellement; 3. StringJoiner convient aux scénarios qui nécessitent des formats plus flexibles tels que les préfixes et les suffixes; 4. Utilisation de Arrays.Stream () combinée avec des collectionneurs.joining () convient au filtrage ou à la conversion du tableau avant de rejoindre; Pour résumer, si Java8 et supérieur est utilisé, la méthode String.join () doit être préférée dans la plupart des cas, ce qui est concis et facile à lire, mais pour une logique complexe, elle est recommandée.

Meilleures pratiques pour gérer les grandes tables MySQL Meilleures pratiques pour gérer les grandes tables MySQL Aug 05, 2025 am 03:55 AM

Lorsque vous traitez avec de grandes tables, les performances MySQL et la maintenabilité sont confrontées à des défis, et il est nécessaire de commencer à partir de la conception structurelle, de l'optimisation des index, de la stratégie de sous-table de tableau, etc. 1. Concevoir raisonnablement les clés et les index primaires: il est recommandé d'utiliser des entiers auto-incrémentés comme clés principales pour réduire les scintillement de pages; Utiliser les index de superposition pour améliorer l'efficacité de la requête; Analyser régulièrement les journaux de requête lents et supprimer les index non valides. 2. Utilisation rationnelle des tables de partition: partition en fonction de la plage de temps et d'autres stratégies pour améliorer l'efficacité de la requête et de la maintenance, mais l'attention devrait être accordée aux problèmes de partitionnement et de coupe. 3. Envisagez de lire et d'écrire la séparation et la séparation des bibliothèques: la séparation de lecture et d'écriture atténue la pression sur la bibliothèque principale. La séparation de la bibliothèque et la séparation des tableaux conviennent aux scénarios avec une grande quantité de données. Il est recommandé d'utiliser des middleware et d'évaluer les problèmes de requête des transactions et des magasins croisés. La planification précoce et l'optimisation continue sont la clé.

See all articles