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

Rumah Java Javabermula java向mysql數(shù)據(jù)庫(kù)批量插入大量數(shù)據(jù)

java向mysql數(shù)據(jù)庫(kù)批量插入大量數(shù)據(jù)

May 01, 2021 pm 12:00 PM
java mysql data

java向mysql數(shù)據(jù)庫(kù)批量插入大量數(shù)據(jù)

首先看下我們的目標(biāo):向mysql數(shù)據(jù)庫(kù)中批量插入10000條數(shù)據(jù)

操作環(huán)境:Mysql和Java代碼都運(yùn)行在我本地Windows電腦(i7處理器,4核,16G運(yùn)行內(nèi)存,64位操作系統(tǒng)

1、JPA單線程執(zhí)行

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

e936e73c19698c810a7fbe3089dedc0.png

2、JPA多線程執(zhí)行

c42f87ce7a5472bb63a5e6f5b1905a5.png

大概需要37S左右,并沒(méi)有想象中的快很多

(免費(fèi)學(xué)習(xí)視頻分享:java視頻教程

原因: 多線程只是大大提高了程序處理數(shù)據(jù)的時(shí)間,并不會(huì)提高插入數(shù)據(jù)庫(kù)的時(shí)間,相反在我這邊JPA的框架下,多線程也就意味著多連接,反而更加消耗數(shù)據(jù)庫(kù)性能

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)部類(lèi),開(kā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、傳統(tǒng)JDBC插入

dc0704ffce72d1e41c81dc8daed9671.png

大概需要8S左右,相較于前兩種方式已經(jīng)快很多了,代碼如下:

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 {
        // 開(kāi)始時(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、最后檢查一下數(shù)據(jù)是否成功存庫(kù),一共30000條,沒(méi)有丟數(shù)據(jù)

822537448de176c183deffcbd45b8f0.png

完成!

相關(guān)推薦:java入門(mén)教程

Atas ialah kandungan terperinci java向mysql數(shù)據(jù)庫(kù)批量插入大量數(shù)據(jù). Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Tutorial PHP
1502
276
Bagaimana menangani transaksi di Java dengan JDBC? Bagaimana menangani transaksi di Java dengan JDBC? Aug 02, 2025 pm 12:29 PM

Untuk mengendalikan transaksi JDBC dengan betul, anda mesti terlebih dahulu mematikan mod komit automatik, kemudian melakukan pelbagai operasi, dan akhirnya melakukan atau mengembalikan semula hasilnya; 1. Panggil Conn.SetAutOcommit (palsu) untuk memulakan transaksi; 2. Melaksanakan pelbagai operasi SQL, seperti memasukkan dan mengemaskini; 3. Panggil Conn.Commit () jika semua operasi berjaya, dan hubungi conn.rollback () jika pengecualian berlaku untuk memastikan konsistensi data; Pada masa yang sama, cuba-dengan-sumber harus digunakan untuk menguruskan sumber, mengendalikan pengecualian dengan betul dan menutup sambungan untuk mengelakkan kebocoran sambungan; Di samping itu, adalah disyorkan untuk menggunakan kolam sambungan dan menetapkan mata simpan untuk mencapai rollback separa, dan menyimpan urus niaga sesingkat mungkin untuk meningkatkan prestasi.

Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Membandingkan kerangka Java: Spring Boot vs Quarkus vs Micronaut Aug 04, 2025 pm 12:48 PM

Pra-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusoftenperforminglightbetterine serverless scenarios.tyvelopecosyste,

Bagaimana pengumpulan sampah berfungsi di java? Bagaimana pengumpulan sampah berfungsi di java? Aug 02, 2025 pm 01:55 PM

Koleksi Sampah Java (GC) adalah mekanisme yang secara automatik menguruskan ingatan, yang mengurangkan risiko kebocoran ingatan dengan menuntut semula objek yang tidak dapat dicapai. 1.GC menghakimi kebolehcapaian objek dari objek akar (seperti pembolehubah stack, benang aktif, medan statik, dan lain -lain), dan objek yang tidak dapat dicapai ditandakan sebagai sampah. 2. Berdasarkan algoritma penandaan tanda, tandakan semua objek yang dapat dicapai dan objek yang tidak ditandai. 3. Mengamalkan strategi pengumpulan generasi: Generasi Baru (Eden, S0, S1) sering melaksanakan MinorGC; Orang tua melakukan kurang tetapi mengambil masa lebih lama untuk melakukan MajorGC; Metaspace Stores Metadata kelas. 4. JVM menyediakan pelbagai peranti GC: SerialGC sesuai untuk aplikasi kecil; ParallelGC meningkatkan throughput; CMS mengurangkan

Menggunakan jenis html `input` untuk data pengguna Menggunakan jenis html `input` untuk data pengguna Aug 03, 2025 am 11:07 AM

Memilih jenis htmlinput yang betul dapat meningkatkan ketepatan data, meningkatkan pengalaman pengguna, dan meningkatkan kebolehgunaan. 1. Pilih jenis input yang sepadan mengikut jenis data, seperti teks, e -mel, tel, nombor dan tarikh, yang secara automatik boleh menyemak dan menyesuaikan diri dengan papan kekunci; 2. Gunakan HTML5 untuk menambah jenis baru seperti URL, Warna, Julat dan Carian, yang dapat memberikan kaedah interaksi yang lebih intuitif; 3. Gunakan pemegang tempat dan sifat -sifat yang diperlukan untuk meningkatkan kecekapan dan ketepatan pengisian bentuk, tetapi harus diperhatikan bahawa pemegang tempat tidak dapat menggantikan label.

Membandingkan Java Build Tools: Maven vs Gradle Membandingkan Java Build Tools: Maven vs Gradle Aug 03, 2025 pm 01:36 PM

GradleisthebetterChoiceFormostNewProjectSduetoitSsuperiorflexibility, Prestasi, danModernToolingSupport.1.Gradle'sGroovy/KOT lindslismoreconciseandexpressivethanmaven'sverbosexml.2.GradleOutPerformsMaveninBuildSpeedWithIncrementalcompilation, BuildCac

Pergi dengan contoh contoh pembalakan middleware http Pergi dengan contoh contoh pembalakan middleware http Aug 03, 2025 am 11:35 AM

HTTP Log Middleware di GO boleh merakam kaedah permintaan, laluan, IP klien dan memakan masa. 1. Gunakan http.handlerfunc untuk membungkus pemproses, 2. Rekod waktu mula dan masa akhir sebelum dan selepas memanggil next.servehttp, 3. Dapatkan IP pelanggan sebenar melalui r.remoteaddr dan X-forward-for headers, 4. Gunakan log.printf untuk mengeluarkan log permintaan, 5. Kod sampel lengkap telah disahkan untuk dijalankan dan sesuai untuk memulakan projek kecil dan sederhana. Cadangan lanjutan termasuk menangkap kod status, menyokong log JSON dan meminta penjejakan ID.

Java Concurrency Utilities: Executorservice dan Fork/Sertai Java Concurrency Utilities: Executorservice dan Fork/Sertai Aug 03, 2025 am 01:54 AM

Executorservice sesuai untuk pelaksanaan asynchronous terhadap tugas bebas, seperti operasi I/O atau tugas masa, menggunakan kolam thread untuk menguruskan konkurensi, mengemukakan tugas -tugas yang boleh dilancarkan atau boleh dipanggil melalui penyerahan, dan mendapatkan hasil dengan masa depan. Perhatikan risiko beratur yang tidak terkawal dan secara jelas menutup kolam benang; 2. Ia sesuai untuk penjumlahan array besar dan senario penyortiran. Ambang perpecahan harus ditetapkan dengan munasabah untuk mengelakkan overhead; 3. Asas Pemilihan: Bebas

Bagaimana untuk menaik taraf pelayan MySQL ke versi yang lebih baru? Bagaimana untuk menaik taraf pelayan MySQL ke versi yang lebih baru? Aug 03, 2025 am 09:04 AM

Checkcompatebilitywithos, aplikasi, dan features; 2.backupalldata, configs, andlogs; 3.chooseupgrademethod (packageManager, mysqlinstaller, ormanual); 4.Runpost-upgradeChecksandTests;

See all articles