亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Java實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù)

 更新時(shí)間:2022年11月17日 11:37:03   作者:子非魚(yú)呀  
這篇文章主要為大家詳細(xì)介紹了Java如何實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù),文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作有一定借鑒價(jià)值,需要的可以參考一下

mysql數(shù)據(jù)庫(kù)準(zhǔn)備

private String Driver = "com.mysql.cj.jdbc.Driver";
    private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
    private String user = "root";
    private String password = "root";
    Connection connection = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    //封裝與數(shù)據(jù)庫(kù)建立連接的類(lèi)
    public void coon() throws Exception{
        Class.forName(Driver);
        connection = DriverManager.getConnection(url,user,password);
    }
    //封裝異常類(lèi)
    public void erro(){
        try {
            if (rs!=null){
                rs.close();
            }
            if (ps!=null){
                ps.close();
            }
            if (connection!=null){
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

方式一:普通插入

package com.wt;
 
import org.junit.Test;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
/**
 * @Author wt
 * @Date 2022/11/14 21:17
 * @PackageName:com.wt
 * @ClassName: TestAddBatch01
 * @Description: TODO
 * @Version 1.0
 */
public class TestAddBatch01 {
    private String Driver = "com.mysql.cj.jdbc.Driver";
    private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai";
    private String user = "root";
    private String password = "root";
    Connection connection = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    public void coon() throws Exception{
        Class.forName(Driver);
        connection = DriverManager.getConnection(url,user,password);
    }
    public void erro(){
        try {
            if (rs!=null){
                rs.close();
            }
            if (ps!=null){
                ps.close();
            }
            if (connection!=null){
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void ccc(){
        long start = System.currentTimeMillis();
        String sql = "insert into a(id, name) VALUES (?,null)";
        try {
            coon();
            ps = connection.prepareStatement(sql);
            for (int i = 1; i <= 1000000; i++) {
                ps.setObject(1, i);//填充sql語(yǔ)句種得占位符
                ps.execute();//執(zhí)行sql語(yǔ)句
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            erro();
        }
        System.out.println("百萬(wàn)條數(shù)據(jù)插入用時(shí):" + (System.currentTimeMillis() - start)+"【單位:毫秒】");
 
    }
 
}

用時(shí):62分鐘多 

方式二:使用批處理插入

package com.wt;
 
import org.junit.Test;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
/**
 * @Author wt
 * @Date 2022/11/14 20:25
 * @PackageName:com.wt.util
 * @ClassName: TestAddBatch
 * @Description: TODO
 * @Version 1.0
 */
public class TestAddBatch {
    private String Driver = "com.mysql.cj.jdbc.Driver";
    private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai";
    private String user = "root";
    private String password = "root";
    Connection connection = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    public void coon() throws Exception{
        Class.forName(Driver);
        connection = DriverManager.getConnection(url,user,password);
    }
    public void erro(){
        try {
            if (rs!=null){
                rs.close();
            }
            if (ps!=null){
                ps.close();
            }
            if (connection!=null){
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void ccc(){
        long start = System.currentTimeMillis();
        String sql = "insert into a(id, name) VALUES (?,null)";
        try {
            coon();
            ps = connection.prepareStatement(sql);
//            connection.setAutoCommit(false);//取消自動(dòng)提交
            for (int i = 1; i <= 1000000; i++) {
                ps.setObject(1, i);
                ps.addBatch();
 
                if (i % 1000 == 0) {
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            ps.executeBatch();
            ps.clearBatch();
//            connection.commit();//所有語(yǔ)句都執(zhí)行完畢后才手動(dòng)提交sql語(yǔ)句
 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            erro();
        }
        System.out.println("百萬(wàn)條數(shù)據(jù)插入用時(shí):" + (System.currentTimeMillis() - start)+"【單位:毫秒】");
 
    }
 
 
}

方式一、二總結(jié):到此可以看出其實(shí)其處理程序及批處理是沒(méi)有起作用的,為此我們使用方式三

方式三:通過(guò)連接配置url設(shè)置【&rewriteBatchedStatements=true】(設(shè)置重寫(xiě)批處理語(yǔ)句)

url地址后注意添加【&rewriteBatchedStatements=true】

private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";

方法三較于方法二的改變是只是url地址上的改變,其它沒(méi)有任何修改 

package com.wt;
 
import org.junit.Test;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
/**
 * @Author wt
 * @Date 2022/11/14 20:25
 * @PackageName:com.wt.util
 * @ClassName: TestAddBatch
 * @Description: TODO
 * @Version 1.0
 */
public class TestAddBatch {
    private String Driver = "com.mysql.cj.jdbc.Driver";
    private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
    private String user = "root";
    private String password = "root";
    Connection connection = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    public void coon() throws Exception{
        Class.forName(Driver);
        connection = DriverManager.getConnection(url,user,password);
    }
    public void erro(){
        try {
            if (rs!=null){
                rs.close();
            }
            if (ps!=null){
                ps.close();
            }
            if (connection!=null){
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void ccc(){
        long start = System.currentTimeMillis();
        String sql = "insert into a(id, name) VALUES (?,null)";
        try {
            coon();
            ps = connection.prepareStatement(sql);
            for (int i = 1; i <= 1000000; i++) {
                ps.setObject(1, i);
                ps.addBatch();
 
                if (i % 1000 == 0) {
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            ps.executeBatch();
            ps.clearBatch();
 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            erro();
        }
        System.out.println("百萬(wàn)條數(shù)據(jù)插入用時(shí):" + (System.currentTimeMillis() - start)+"【單位:毫秒】");
 
    }
 
 
}

用時(shí):【10秒左右】

到此批處理語(yǔ)句才正是生效

注意

數(shù)據(jù)庫(kù)連接的url設(shè)置了【&rewriteBatchedStatements=true】時(shí),java代碼種的sql語(yǔ)句不能有分號(hào)【;】號(hào),否則批處理語(yǔ)句打包就會(huì)出現(xiàn)錯(cuò)誤,導(dǎo)致后面的sql語(yǔ)句提交出現(xiàn)【BatchUpdateException】異常

方式四:通過(guò)數(shù)據(jù)庫(kù)連接取消自動(dòng)提交,手動(dòng)提交數(shù)據(jù)

package com.wt;
 
import org.junit.Test;
 
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
 
/**
 * @Author wt
 * @Date 2022/11/14 20:25
 * @PackageName:com.wt.util
 * @ClassName: TestAddBatch
 * @Description: TODO
 * @Version 1.0
 */
public class TestAddBatch {
    private String Driver = "com.mysql.cj.jdbc.Driver";
    private String url ="jdbc:mysql://localhost:3306/mp?serverTimezone=Asia/Shanghai&rewriteBatchedStatements=true";
    private String user = "root";
    private String password = "root";
    Connection connection = null;
    PreparedStatement ps = null;
    ResultSet rs = null;
    public void coon() throws Exception{
        Class.forName(Driver);
        connection = DriverManager.getConnection(url,user,password);
    }
    public void erro(){
        try {
            if (rs!=null){
                rs.close();
            }
            if (ps!=null){
                ps.close();
            }
            if (connection!=null){
                connection.close();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
 
    @Test
    public void ccc(){
        long start = System.currentTimeMillis();
        String sql = "insert into a(id, name) VALUES (?,null)";
        try {
            coon();
            ps = connection.prepareStatement(sql);
            connection.setAutoCommit(false);//取消自動(dòng)提交
            for (int i = 1; i <= 1000000; i++) {
                ps.setObject(1, i);
                ps.addBatch();
 
                if (i % 1000 == 0) {
                    ps.executeBatch();
                    ps.clearBatch();
                }
            }
            ps.executeBatch();
            ps.clearBatch();
            connection.commit();//所有語(yǔ)句都執(zhí)行完畢后才手動(dòng)提交sql語(yǔ)句
 
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            erro();
        }
        System.out.println("百萬(wàn)條數(shù)據(jù)插入用時(shí):" + (System.currentTimeMillis() - start)+"【單位:毫秒】");
 
    }
 
 
}

 用時(shí):【9秒左右】

總結(jié):

1.使用批量提交數(shù)據(jù),url一定要設(shè)置允許重寫(xiě)批量提交【rewriteBatchedStatements=true】,以及此時(shí)的sql語(yǔ)句一定不能有分號(hào),否則有【BatchUpdateException】異常,

2.其他的就正常使用PreparedStatement ps;的以下三個(gè)方法即可

  • ps.addBatch();      將sql語(yǔ)句打包到一個(gè)容器中
  • ps.executeBatch();  將容器中的sql語(yǔ)句提交
  • ps.clearBatch();    清空容器,為下一次打包做準(zhǔn)備

以上就是Java實(shí)現(xiàn)十秒向MySQL插入百萬(wàn)條數(shù)據(jù)的詳細(xì)內(nèi)容,更多關(guān)于Java MySQL插入數(shù)據(jù)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • Java編程之如何通過(guò)JSP實(shí)現(xiàn)頭像自定義上傳

    Java編程之如何通過(guò)JSP實(shí)現(xiàn)頭像自定義上傳

    之前做這個(gè)頭像上傳功能還是花了好多時(shí)間的,今天我將我的代碼分享給大家,下面這篇文章主要給大家介紹了關(guān)于Java編程之如何通過(guò)JSP實(shí)現(xiàn)頭像自定義上傳的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2022-12-12
  • Java  匿名內(nèi)部類(lèi)詳解及實(shí)例代碼

    Java 匿名內(nèi)部類(lèi)詳解及實(shí)例代碼

    這篇文章主要介紹了Java 匿名內(nèi)部類(lèi)詳解及實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下
    2017-02-02
  • Java基礎(chǔ)之static關(guān)鍵字的使用講解

    Java基礎(chǔ)之static關(guān)鍵字的使用講解

    這篇文章主要介紹了Java基礎(chǔ)之static關(guān)鍵字的使用講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 如何使用JaCoCo分析java單元測(cè)試覆蓋率

    如何使用JaCoCo分析java單元測(cè)試覆蓋率

    在做單元測(cè)試時(shí),代碼覆蓋率常常被拿來(lái)作為衡量測(cè)試好壞的指標(biāo),甚至,用代碼覆蓋率來(lái)考核測(cè)試任務(wù)完成情況,比如,代碼覆蓋率必須達(dá)到80%或 90%。于是乎,測(cè)試人員費(fèi)盡心思設(shè)計(jì)案例覆蓋代碼。下面我們來(lái)學(xué)習(xí)一下吧
    2019-06-06
  • JAVA中Object的常用方法

    JAVA中Object的常用方法

    JAVA中Object是所有對(duì)象的頂級(jí)父類(lèi),存在于java.lang包中,這個(gè)包不需要我們手動(dòng)導(dǎo)包,本文通過(guò)實(shí)例代碼介紹JAVA中Object的常用方法,感興趣的朋友一起看看吧
    2023-11-11
  • Spring?Boot?4.0對(duì)于Java開(kāi)發(fā)的影響和前景

    Spring?Boot?4.0對(duì)于Java開(kāi)發(fā)的影響和前景

    探索Spring?Boot?4.0如何徹底革新Java開(kāi)發(fā),提升效率并開(kāi)拓未來(lái)可能性!別錯(cuò)過(guò)這篇緊湊的指南,它帶你領(lǐng)略Spring?Boot的強(qiáng)大魅力和潛力,準(zhǔn)備好了嗎?
    2024-02-02
  • GateWay路由規(guī)則與動(dòng)態(tài)路由詳細(xì)介紹

    GateWay路由規(guī)則與動(dòng)態(tài)路由詳細(xì)介紹

    這篇文章主要介紹了GateWay路由規(guī)則與GateWay動(dòng)態(tài)路由,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-09-09
  • Spring Security OAuth2實(shí)現(xiàn)使用JWT的示例代碼

    Spring Security OAuth2實(shí)現(xiàn)使用JWT的示例代碼

    這篇文章主要介紹了Spring Security OAuth2實(shí)現(xiàn)使用JWT的示例代碼,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2018-09-09
  • 談?wù)凥ttpClient使用詳解

    談?wù)凥ttpClient使用詳解

    這篇文章給大家介紹HttpClient使用,httpClient是一個(gè)客戶端的http通信實(shí)現(xiàn)庫(kù),HttpClient的目標(biāo)是發(fā)送和接收HTTP報(bào)文。本文講解的非常詳細(xì),對(duì)HttpClient使用感興趣的朋友可以參考下
    2015-10-10
  • SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實(shí)現(xiàn)方法

    SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實(shí)現(xiàn)方法

    這篇文章主要介紹了SpringBoot 利用MultipartFile上傳本地圖片生成圖片鏈接的實(shí)現(xiàn)方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2021-03-03

最新評(píng)論