国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

SQLServerBulkCopy大容量插入、更新操作

這篇具有很好參考價(jià)值的文章主要介紹了SQLServerBulkCopy大容量插入、更新操作。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

說(shuō)明

pro環(huán)境在程序啟動(dòng)時(shí)需要運(yùn)行50w update sql,在uat環(huán)境測(cè)試
1)分批1000每次,批量更新需要花時(shí)間120s左右;
2)采用下面類(lèi)似第二個(gè)測(cè)試用例(先把數(shù)據(jù)插入臨時(shí)表、臨時(shí)表同步主表、刪除臨時(shí)表),最終只花了34s,其中插入花了14s,臨時(shí)表更新到主表花了18s多
3)繼承自SQLServerBulkCSVFileRecord進(jìn)行大容量復(fù)制,比CachedRowSetImpl方式更快;

代碼

package com.ydfind.driver.ok;

import com.microsoft.sqlserver.jdbc.SQLServerBulkCSVFileRecord;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions;
import com.microsoft.sqlserver.jdbc.SQLServerException;
import org.junit.Test;

import java.io.ByteArrayInputStream;
import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class MyBulkCopyTest {

    // 1w數(shù)據(jù)7332ms
    @Test
    public void testBulkInsert() throws SQLException {
        // drd notes:
        long time = System.currentTimeMillis();

        String connectionUrl = "jdbc:sqlserver://localhost:1433;databaseName=dev-data;user=sa;password=465628578";
        String tableName = "bulkCopyTest";
        String deleteSql = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].["
                + tableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [" + tableName + "]";
        String createSql = "create table " + tableName + " (c1 bigint, c2 varchar(20))";
        // 要插入的數(shù)據(jù)
        List<Object[]> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            Object[] objects = new Object[2];
            objects[0] = Long.valueOf(i);
            objects[1] = "name_" + i;
            list.add(objects);
        }
        MySQLServerBulkRecord bulkRecord = new MySQLServerBulkRecord(list);
        bulkRecord.addColumnMetadata(1, "c1", Types.BIGINT, 19, 0);
//        bulkRecord.addColumnMetadata(1, "c1", Types.BIGINT, 19, 0);
        bulkRecord.addColumnMetadata(2, "c2", Types.VARCHAR, 20, 0);

        try (Connection connection = DriverManager.getConnection(connectionUrl);
             Statement statement = connection.createStatement();){
            connection.setAutoCommit(false);
            // 卸了舊的表
            statement.execute(deleteSql);
            // 創(chuàng)建新表
            statement.execute(createSql);

            // BULK INSERT
            SQLServerBulkCopyOptions options = new SQLServerBulkCopyOptions();
            options.setTableLock(true);
//            options.setBatchSize(10_0000);
            SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(connection);
            bulkCopy.setBulkCopyOptions(options);
            bulkCopy.setDestinationTableName(tableName);

            bulkCopy.writeToServer(bulkRecord);

            connection.commit();
            bulkCopy.close();
        }
        System.out.println("cost time " + (System.currentTimeMillis() - time));
    }

    public class MySQLServerBulkRecord extends SQLServerBulkCSVFileRecord {
        private List<Object[]> dataList;
        private int cur;
        public MySQLServerBulkRecord(List<Object[]> dataList) throws SQLServerException {
            super(new ByteArrayInputStream(new byte[]{}), "UTF-8", ",", false);
            this.dataList = dataList;
            cur = -1;
        }

        @Override
        public boolean next() throws SQLServerException {
            return ++cur < dataList.size();
        }

        @Override
        public Object[] getRowData() throws SQLServerException {
            if (cur >= dataList.size()) {
                return null;
            }
            return dataList.get(cur);
        }

    }

    // 更新到bulkCopyTest:先插入到臨時(shí)表bulkCopyTestTemp,再u(mài)pdate到bulkCopyTest,再刪除臨時(shí)表
    // 1w數(shù)據(jù)cost time 4362
    @Test
    public void testBulkUpdate() throws SQLException {
        // drd notes:
        long time = System.currentTimeMillis();

        String connectionUrl = "jdbc:sqlserver://localhost:1433;databaseName=dev-data;user=sa;password=465628578";
        String tableName = "bulkCopyTestTemp";
        String tableNameTarget = "bulkCopyTest";
        String deleteSql = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].["
                + tableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [" + tableName + "]";
        String createSql = "create table " + tableName + " (c1 bigint, c2 varchar(20))";
        String updateSql = "update " + tableNameTarget + " with(TABLOCK)  set c2 = t2.c2 from " + tableName + " t2 with(nolock) where " + tableNameTarget + ".c1 = t2.c1";
        // 要插入的數(shù)據(jù)
        List<Object[]> list = new ArrayList<>();
        for (int i = 0; i < 10000; i++) {
            Object[] objects = new Object[2];
            objects[0] = Long.valueOf(i);
            objects[1] = "name1_" + i;
            list.add(objects);
        }
        MySQLServerBulkRecord bulkRecord = new MySQLServerBulkRecord(list);
        bulkRecord.addColumnMetadata(1, "c1", Types.BIGINT, 19, 0);
//        bulkRecord.addColumnMetadata(1, "c1", Types.BIGINT, 19, 0);
        bulkRecord.addColumnMetadata(2, "c2", Types.VARCHAR, 20, 0);

        try (Connection connection = DriverManager.getConnection(connectionUrl);
             Statement statement = connection.createStatement();){
            connection.setAutoCommit(false);
            // 臨時(shí)表
            statement.execute(deleteSql);
            statement.execute(createSql);

            SQLServerBulkCopyOptions options = new SQLServerBulkCopyOptions();
            options.setTableLock(true);
            options.setBatchSize(10_0000);
            SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(connection);
            bulkCopy.setBulkCopyOptions(options);
            bulkCopy.setDestinationTableName(tableName);

            bulkCopy.writeToServer(bulkRecord);

            // 從臨時(shí)表更新到主表
            statement.execute(updateSql);
            // 刪除臨時(shí)表
            statement.execute(deleteSql);

            connection.commit();
            bulkCopy.close();
        }
        // 1w數(shù)據(jù)7332ms
        System.out.println("cost time " + (System.currentTimeMillis() - time));
    }
}

分析

第一個(gè)測(cè)試用例后,結(jié)果:
bulkcopy sqlserver,SqlServer,sqlserver,microsoft,sql
第二個(gè)測(cè)試用例結(jié)果
bulkcopy sqlserver,SqlServer,sqlserver,microsoft,sql

50w數(shù)據(jù)插入示例-本地電腦

package com.ydfind.driver;

import com.microsoft.sqlserver.jdbc.SQLServerBulkCopy;
import com.microsoft.sqlserver.jdbc.SQLServerBulkCopyOptions;
import com.ydfind.driver.ok.MySQLServerBulkRecord;
import org.junit.Test;

import java.sql.*;
import java.util.ArrayList;
import java.util.List;

public class BulkCopyInsertTest {
    private static String testTableName = "test_insert";
    private static String dropSql = "if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[" + testTableName + "]') and OBJECTPROPERTY(id, N'IsUserTable') = 1) DROP TABLE [" + testTableName + "]";
    private static String createTableName = "create table " + testTableName + "(c1 bigint, c2 varchar(20), c3 bigint)";

    @Test
    public void testInsert() throws SQLException {
        // 1.若存在表,則刪除表
        // 2.創(chuàng)建表
        // 3.插入10w數(shù)據(jù)
        // 4.記錄插入10w數(shù)據(jù)的時(shí)間輸出
        String url = "jdbc:sqlserver://localhost:1433;databaseName=rec-manager;user=sa;password=465628578";
        try (Connection conn = DriverManager.getConnection(url);
             Statement statement = conn.createStatement()) {
            statement.execute(dropSql);
            statement.execute(createTableName);

            // 插入10w條記錄
            long time = System.currentTimeMillis();
            int id = 0;
            String sql = "insert into " + testTableName + "(c1, c2, c3) values(%d,'%s',%d)";
            for (int i = 0; i < 500; i++) {
                for (int j = 0; j < 1000; j++) {
                    id++;
                    String sql1 = String.format(sql, id, "name1_" + id, id);
                    statement.addBatch(sql1);
                }
                statement.executeBatch();
            }
            System.out.println("batch insert cost time = " + (System.currentTimeMillis() - time));
        }
    }

    @Test
    public void testBulkCopyInsert() throws SQLException {
        // 1.若存在表,則刪除表
        // 2.創(chuàng)建表
        // 3.插入10w數(shù)據(jù)
        // 4.記錄插入10w數(shù)據(jù)的時(shí)間輸出
        String url = "jdbc:sqlserver://localhost:1433;databaseName=rec-manager;user=sa;password=465628578";
        try (Connection conn = DriverManager.getConnection(url);
             Statement statement = conn.createStatement()) {
            statement.execute(dropSql);
            statement.execute(createTableName);

            // 插入10w條記錄
            long time = System.currentTimeMillis();

            List<Object[]> list = new ArrayList<>();
            for (int i = 0; i < 50_0000; i++) {
                Object[] objects = new Object[3];
                objects[0] = Long.valueOf(i);
                objects[1] = "name1_" + i;
                objects[2] = Long.valueOf(i);
                list.add(objects);
            }
            MySQLServerBulkRecord bulkRecord = new MySQLServerBulkRecord(list);
            bulkRecord.addColumnMetadata(1, "c1", Types.BIGINT, 19, 0);
            bulkRecord.addColumnMetadata(2, "c2", Types.VARCHAR, 20, 0);
            bulkRecord.addColumnMetadata(3, "c3", Types.BIGINT, 19, 0);

            SQLServerBulkCopyOptions options = new SQLServerBulkCopyOptions();
            options.setTableLock(true);
            options.setBatchSize(10000);
            SQLServerBulkCopy bulkCopy = new SQLServerBulkCopy(conn);
            bulkCopy.setBulkCopyOptions(options);
            bulkCopy.setDestinationTableName(testTableName);

            bulkCopy.writeToServer(bulkRecord);

            bulkCopy.close();
            System.out.println("bulkCopy insert cost time = " + (System.currentTimeMillis() - time));
        }
    }
}

bulkcopy sqlserver,SqlServer,sqlserver,microsoft,sql

bulkCopy insert cost time = 25052
batch insert cost time = 222397

可見(jiàn)bulkCopy的方式可以提升接近8倍。把executeBatch()每次的數(shù)量從1000提高到1w,執(zhí)行時(shí)間也需要175495,接近3分鐘。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-632489.html

到了這里,關(guān)于SQLServerBulkCopy大容量插入、更新操作的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶(hù)投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • USB大容量存儲(chǔ)設(shè)備無(wú)法啟動(dòng)該怎么辦?

    USB大容量存儲(chǔ)設(shè)備無(wú)法啟動(dòng)該怎么辦?

    USB大容量存儲(chǔ)設(shè)備(USB mass storage device class,也稱(chēng)為USB MSC或UMS)是一個(gè)協(xié)議,允許一個(gè)USB接口的設(shè)備與電腦相連接,以便在兩者之間傳輸文件。對(duì)于電腦來(lái)說(shuō),USB設(shè)備看起來(lái)就像一個(gè)移動(dòng)硬盤(pán),允許拖放型文件傳送。它包括移動(dòng)硬盤(pán)、閃存盤(pán)、移動(dòng)光驅(qū)、讀卡器、數(shù)碼相機(jī)、

    2024年02月11日
    瀏覽(22)
  • 低成本、大容量、高交互…Polkadot 引領(lǐng) GameFi 實(shí)現(xiàn)新突破

    低成本、大容量、高交互…Polkadot 引領(lǐng) GameFi 實(shí)現(xiàn)新突破

    有一天,你可以邊打游戲邊賺錢(qián),實(shí)現(xiàn) Play to earn 的夢(mèng)想。 這話(huà)或許聽(tīng)來(lái)有些白日夢(mèng),但隨著區(qū)塊鏈行業(yè)的高速發(fā)展, DeFi、NFT 的興起,傳統(tǒng)游戲也在區(qū)塊鏈行業(yè)的大背景下實(shí)現(xiàn)新一步的更迭。Play To earn 的理想正在加速落地,GameFi 賽道的火爆讓越來(lái)越多的技術(shù)開(kāi)發(fā)人員投身

    2024年02月02日
    瀏覽(27)
  • 買(mǎi)手機(jī)就要買(mǎi)大容量的以及為什么手機(jī)內(nèi)存滿(mǎn)了之后會(huì)變卡

    買(mǎi)手機(jī)就要買(mǎi)大容量的以及為什么手機(jī)內(nèi)存滿(mǎn)了之后會(huì)變卡

    我現(xiàn)在手里正在用的這個(gè)是 IPhone XR,2019 年還是 2018 年買(mǎi)的,我記得買(mǎi)的時(shí)候已經(jīng)上市一段時(shí)間了。這個(gè)是蘋(píng)果第一款雙卡雙待的手機(jī),到現(xiàn)在用了三四年了。 都說(shuō)蘋(píng)果的手機(jī)可以用很多年還很流暢,而安卓的手機(jī)一般一兩年就卡的沒(méi)法用,需要換了。這種說(shuō)法有一定的依據(jù)

    2024年02月09日
    瀏覽(22)
  • 三維后處理與重建PACS源碼,大容量圖像存儲(chǔ) 報(bào)告單多種模式及自定義樣式

    三維后處理與重建PACS源碼,大容量圖像存儲(chǔ) 報(bào)告單多種模式及自定義樣式

    醫(yī)學(xué)影像系統(tǒng)源碼 三維后處理與重建PACS源碼 醫(yī)學(xué)影像系統(tǒng)由PACS系統(tǒng)、RIS系統(tǒng)組成,同時(shí)提供與HIS的接口(HL7或其他類(lèi)型) 。 主要功能介紹 信息預(yù)約登記 支持對(duì)患者、檢查項(xiàng)目、申請(qǐng)醫(yī)生、申請(qǐng)單據(jù)、設(shè)備等信息進(jìn)行管理。且支持檢查病人排隊(duì)管理功能; 支持大屏幕隊(duì)列

    2024年02月03日
    瀏覽(21)
  • 【完美解決】Windows下移動(dòng)硬盤(pán)無(wú)法彈出 | 彈出USB大容量存儲(chǔ)設(shè)備時(shí)出問(wèn)題 | Windows無(wú)法停用設(shè)備 | \$Extend\$RmMetadata\$TxfLog\$TxfLog.blf

    【完美解決】Windows下移動(dòng)硬盤(pán)無(wú)法彈出 | 彈出USB大容量存儲(chǔ)設(shè)備時(shí)出問(wèn)題 | Windows無(wú)法停用設(shè)備 | \$Extend\$RmMetadata\$TxfLog\$TxfLog.blf

    使用U盤(pán)或者移動(dòng)硬盤(pán)彈總是會(huì)遇到無(wú)法彈出的情況。此時(shí)windows往往不會(huì)告訴你具體是什么設(shè)備占用,只會(huì)提示: 彈出 USB 大容量存儲(chǔ)設(shè)備 時(shí)出問(wèn)題 或 Windows 無(wú)法停用“通用卷”設(shè)備,原因是某個(gè)程序正在使用它。關(guān)閉可能使用該設(shè)備的所有程序,然后稍后重試。 有時(shí)候我

    2024年02月11日
    瀏覽(21)
  • .NET 數(shù)據(jù)庫(kù)大數(shù)據(jù)操作方案(插入、更新、刪除、查詢(xún) 、插入或更新)

    海量數(shù)據(jù)操作ORM性能瓶頸在實(shí)體轉(zhuǎn)換上面,并且不能使用常規(guī)的Sql去實(shí)現(xiàn) 當(dāng)列越多轉(zhuǎn)換越慢,SqlSugar將轉(zhuǎn)換性能做到極致,并且采用數(shù)據(jù)庫(kù)最佳API 操作數(shù)據(jù)庫(kù)達(dá)到極限性能,當(dāng)然你如果不用sqlsugar了解一下原理也可以使用其他ORM實(shí)現(xiàn) ? BulkCopy是一種用于高效批量插入大量數(shù)據(jù)

    2024年02月08日
    瀏覽(23)
  • 一個(gè)事務(wù)插入,另外一個(gè)事務(wù)更新操作,是否會(huì)更新成功?

    一個(gè)事務(wù)插入,另外一個(gè)事務(wù)更新操作,是否會(huì)更新成功?

    同樣另外一個(gè)非常有意思的題目,值得我們思考。大概背景是這個(gè)樣子的。如果有一個(gè)事務(wù)A進(jìn)行插入 id 100, 同時(shí)另外一個(gè)事務(wù)B進(jìn)行更新update id 100。那么事務(wù)B是否會(huì)更新成功。我們來(lái)畫(huà)一個(gè)時(shí)序圖: time 事務(wù)A 事務(wù)B 備注 T1 insert id 100 set status = 1 T2 update id 100 set status = 2 T3 最后

    2023年04月13日
    瀏覽(27)
  • C語(yǔ)言中實(shí)現(xiàn)順序表的插入、刪除和更新操作(附帶源碼)

    C語(yǔ)言中,順序表是一種線(xiàn)性表的存儲(chǔ)結(jié)構(gòu),可以通過(guò)數(shù)組來(lái)實(shí)現(xiàn)。以下是順序表的插入、刪除和更新操作的基本示例: 刪除操作: 更新操作: 這些示例代碼演示了如何在C語(yǔ)言中實(shí)現(xiàn)順序表的插入、刪除和更新操作。你可以根據(jù)需要進(jìn)行修改和擴(kuò)展。 希望你也學(xué)會(huì)了,更多

    2024年01月24日
    瀏覽(23)
  • 如何使用 Python 操作 MongoDB,包括連接、插入、查詢(xún)、更新和刪除數(shù)據(jù),以及進(jìn)階用法

    如何使用 Python 操作 MongoDB,包括連接、插入、查詢(xún)、更新和刪除數(shù)據(jù),以及進(jìn)階用法

    MongoDB 是一種流行的 NoSQL 數(shù)據(jù)庫(kù),支持面向文檔的數(shù)據(jù)存儲(chǔ)。Python 是一種流行的編程語(yǔ)言,提供了許多庫(kù)和工具,方便與 MongoDB 進(jìn)行交互。在本文中,我們將介紹如何使用 Python 操作 MongoDB,包括連接、插入、查詢(xún)、更新和刪除數(shù)據(jù),以及一些高級(jí)用法。 連接 MongoDB 在使用

    2024年02月04日
    瀏覽(21)
  • Java8 實(shí)現(xiàn)批量插入和更新,SpringBoot實(shí)現(xiàn)批量插入和更新,Mybatis實(shí)現(xiàn)批量插入和更新

    基于mybatis實(shí)現(xiàn)的批量插入和更新 由于直接執(zhí)行批量所有數(shù)據(jù)可能會(huì)出現(xiàn)長(zhǎng)度超出報(bào)錯(cuò)問(wèn)題,使用如下方式即可解決 原理還是分配執(zhí)行,這里的100就是設(shè)定每次執(zhí)行最大數(shù) 這里使用插入作為例子,也可以使用批量更新 更新的寫(xiě)法

    2024年02月12日
    瀏覽(31)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包