Java 關于批量插入遇到的問題 -sqlserver

序言:

? ? ? ? 我們在做項目的時候,經常會遇到,對數據的新增動作,如果數據量很少的情況下,單個新增對性能還好,但是一旦涉及到 大數據量,如十萬,百萬,千萬,這個時候如果采用單個新增,那么整個系統都得癱瘓,響應時間 小時級別了,就可以出門左轉,28路公交,火車站,回老家了。

吐槽:

????????對于項目而言,性能是最重要的,性能的快慢,對客戶的體驗和公司的名譽有著直接關系,要想代碼寫得好,首先圍著性能跑。這幾天一直在搞大數據插入的功能,自己總結了一些經驗,供于各位大佬參考:

1、定時實體
@Data
@EqualsAndHashCode(callSuper = false)
@TableName("Dictionary_Info")
@ApiModel(value="DictionaryInfo對象", description="")
public class DictionaryInfo implements Serializable {private static final long serialVersionUID = 1L;@ApiModelProperty(value = "主鍵ID")@TableId(value = "ID", type = IdType.AUTO)private Integer id;@ApiModelProperty(value = "編碼")@TableField("DI_Code")private String diCode;@ApiModelProperty(value = "名稱")@TableField("DI_Name")private String diName;@ApiModelProperty(value = "描述")@TableField("DI_Desc")private String diDesc;@ApiModelProperty(value = "類型")@TableField("DI_Type")private String diType;@ApiModelProperty(value = "是否刪除")@TableField("IsDelete")private Boolean isdelete;@TableField("TS")private Date ts;}
2、定義mapper.xml文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.walmart.java.sams.api.mapper.OrderplanConfirmMapper"><insert id="insertBs" parameterType="保存數據庫的參數實體">
INSERT INTO Dictionary_Info (DI_Code, DI_Name, DI_Desc, DI_Type, IsDelete, TS) VALUES(#{diCode}, #{diName}, #{diDesc}, #{diType}, #{isDelete, #{ts};</insert>
</mapper>
3、定時一個接口

//服務類
public interface IDictionaryInfoService extends IService<DictionaryInfo> {void insertBs(List<DictionaryInfo> list);
}

一、MyBatis 集合方式批量新增

1、定義Mapper
@Mapper
public interface DictionaryInfoMapper extends BaseMapper<DictionaryInfo> {//MyBatis以集合方式批量新增void insertBs(DictionaryInfomodel);
}
2、實現批量插入方法
@Service
//服務實現類
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;//MyBatis以集合方式批量新增public void insertBs(List<DictionaryInfo> list) {SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);list.stream().forEach(p -> baseMapper.insertBs(p));sqlSession.commit();sqlSession.clearCache();}public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入insertBs(dicList);}}

二、MyBatis-Plus提供的SaveBatch方法

1、實現批量插入方法
@Service
//服務實現類
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {@Autowiredprivate SqlSessionFactory sqlSessionFactory;//MyBatis以集合方式批量新增public void insertBs(List<DictionaryInfo> list) {SqlSession sqlSession = sqlSessionFactory.openSession(ExecutorType.BATCH, false);list.stream().forEach(p -> baseMapper.insertBs(p));sqlSession.commit();sqlSession.clearCache();}public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入saveBatch(dicList);}}//服務類
public interface IDictionaryInfoService extends IService<DictionaryInfo> {void insertBs(List<DictionaryInfo> list);
}

三、MyBatis-Plus? 的 InsertBatchSomeColumn?

1、自定義?BatchPlusSqlInjector 類
public class BatchPlusSqlInjector extends DefaultSqlInjector {@Override//傳入對象,類,反射對象的屬性public List<AbstractMethod> getMethodList(Class<?> mapperClass, TableInfo tableInfo) {List<AbstractMethod> methodList = super.getMethodList(mapperClass, tableInfo);methodList.add(new InsertBatchSomeColumn(i -> i.getFieldFill() != FieldFill.UPDATE));return methodList;}}
2、定時項目啟動,加載的核心類
@Configuration
public class MybatisPlusConfig {public BatchPlusSqlInjector sqlInjector() {return new BatchPlusSqlInjector();}
}
3、自定義一個Mapper接口
public interface BatchPlusBaseMapper<T> extends BaseMapper<T> {Integer insertBatchSomeColumn(Collection<T> entityList);
}
4、定義Mapper繼承?BatchPlusBaseMapper
@Mapper
public interface DictionaryInfoMapper<T> extends EasyBaseMapper<DictionaryInfo> {}
實現批量插入方法
@Service
//服務實現類
public class DictionaryInfoServiceImpl extends ServiceImpl<DictionaryInfoMapper, DictionaryInfo> implements IDictionaryInfoService {public void TestInsert(){long start = System.currentTimeMillis();List<DictionaryInfo> dicList = new ArrayList<>();DictionaryInfo dInfo;for(int i = 0 ;i < 10000; i++) {dInfo.setDiCode("1"+i);dInfo.setDiDesc("2");dInfo.setDiType("c");dInfo.setIsdelete(false);dInfo.setDiName("test");dicList .add(dInfo);}//批量插入baseMapper.insertBatchSomeColumn(dicList )}}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/167934.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/167934.shtml
英文地址,請注明出處:http://en.pswp.cn/news/167934.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

RabbitMq使用與整合

MQ基本概念 MQ概述 MQ全稱 Message Queue&#xff08;[kju?]&#xff09;&#xff08;消息隊列&#xff09;&#xff0c;是在消息的傳輸過程中保存消息的容器。多用于分布式系統之間進行通信。 &#xff08;隊列是一種容器&#xff0c;用于存放數據的都是容器&#xff0c;存…

優秀的時間追蹤軟件Timemator for Mac輕松管理時間!

在現代社會&#xff0c;時間管理成為了我們工作和生活中的一大挑戰。如果你經常感到時間不夠用&#xff0c;無法高效地完成任務&#xff0c;那么Timemator for Mac將成為你的得力助手。 Timemator for Mac是一款出色的時間追蹤軟件&#xff0c;它可以幫助你精確記錄和管理你的…

Linux的基本指令 ( 一 )

目錄 前言 Linux基本指令 快速認識五個指令 ls指令 補充內容 pwd指令 補充內容 cd指令 補充內容 重新認識指令 指令的本質 which指令 alias指令 最后 一個文件的三種時間 tree指令及安裝 tree指令 前言 關于Linux操作系統的桌面&#xff0c;在學校教學中我們…

實用高效 無人機光伏巡檢系統助力電站可持續發展

近年來&#xff0c;我國光伏發電行業規模日益壯大&#xff0c;全球領先地位愈發鞏固。為解決光伏電站運維中的難題&#xff0c;浙江某光伏電站與復亞智能達成戰略合作&#xff0c;共同推出全自動無人機光伏巡檢系統&#xff0c;旨在提高發電效率、降低運維成本&#xff0c;最大…

Spark---SparkCore(一)

一、術語與寬窄依賴 1、術語解釋 1、Master(standalone):資源管理的主節點&#xff08;進程&#xff09; 2、Cluster Manager:在集群上獲取資源的外部服務(例如&#xff1a;standalone,Mesos,Yarn) 3、Worker Node(standalone):資源管理的從節點(進程)或者說管理本機資源的…

用Python寫一個瀏覽器集群框架

更多Python學習內容&#xff1a;ipengtao.com 在分布式爬蟲和大規模數據采集的場景中&#xff0c;使用瀏覽器集群是一種有效的方式&#xff0c;可以提高數據采集的速度和效率。本文將介紹如何用Python編寫一個簡單但強大的瀏覽器集群框架&#xff0c;以應對需要使用多個瀏覽器實…

WebGL/threeJS面試題掃描與總結

什么是 WebGL&#xff1f;什么是 Three.js&#xff1f;請解釋three.js中的WebGL和Canvas的區別&#xff1f; WebGL(全寫Web Graphics Library)是一種3D繪圖協議&#xff0c;這種繪圖技術標準允許把JavaScript和OpenGL ES 2.0結合在一起&#xff0c;通過增加OpenGL ES 2.0的一個…

分庫分表、分布式數據庫、MPP

分庫分表、分布式數據庫、MPP的區別嗎&#xff1f; 一、MySQL分庫分表和MySQL分布式集群在性能方面各有優劣&#xff0c;具體取決于應用場景和需求。 MySQL分庫分表&#xff1a; 在分庫分表的場景下&#xff0c;可以將負載分散到多個數據庫實例上&#xff0c;從而提高整體性能…

【模糊測試】課堂筆記

模糊測試 模糊測試過程通常是自動化的。這個過程經典地分為以下幾個階段。 準備&#xff1a;這是第一階段&#xff0c;重點是 SUT 輸入和輸出格式的識別和規范。基于此&#xff0c;規范可以減少生成初始無效模糊數據的可能性并創建有效且精確的輸入。Fuzz Data Generation&am…

思科模擬器操作命令

模式 思科模擬器常見的模式有 用戶模式 能夠操作的命令比較少 特權模式特權模式下面可以操作的比較多 全局模式 接口模式 用戶模式進入特權模式: 命令enable 特權模式進行全局模式命令: configure terminal 退出命令 exit命令&#xff1a;返回上一層&#xff0c;即一步一步…

RocketMQ 消息中間件 知識點匯總

目錄 RocketMQ1、什么是RocketMQ?常用術語:2、為什么需要消息隊列3、什么是異步處理4、什么是服務解耦5、什么是流量控制6、消息隊列兩種模型隊列模型:發布/訂閱模型:總結:7、怎么保證消息不丟失8、如何處理消息被重復消費**出現消息重復的情況:****解決方法:**9、如何保…

流量分析-PhishingEmail_WriteUp

一、題目問題 問題1&#xff1a;黑客的email名稱 問題2&#xff1a;黑客向幾人發送了釣魚郵件 問題3&#xff1a;黑客傳輸的木馬文件名 問題4&#xff1a;下載并運行了木馬文件的人的email名稱和ip地址&#xff0c;用“-”連接 問題5&#xff1a;黑客用于反彈shell的主機i…

什么葡萄酒會適用這種雙重潷析方法呢?

潷析有兩個主要目的&#xff0c;一種是去除陳年或未經過濾的葡萄酒中的沉淀物。雖然沉淀物不會對你造成任何傷害&#xff0c;但當喝葡萄酒滿嘴都是葡萄沉淀物時是一件很糟糕的事。其次&#xff0c;傾析葡萄酒是可以讓葡萄酒“呼吸”與氧氣接觸的&#xff0c;氧氣可以軟化單寧&a…

二維數值型數組例題

1、單位矩陣初始化 題目描述 對用作單位矩陣的數組初始化。單位矩陣在主對角線上的值為1&#xff0c;而其他的地方的值為0&#xff0c;并且主對角線上的行、列下標是一樣的。 輸入要求 輸入一個整數n表示矩陣的行數 輸出要求 輸出n*n的單位矩陣。數據之間以空格間隔&…

LeetCode Hot100 102.二叉樹的層序遍歷

題目&#xff1a; 給你二叉樹的根節點 root &#xff0c;返回其節點值的 層序遍歷 。 &#xff08;即逐層地&#xff0c;從左到右訪問所有節點&#xff09;。 方法&#xff1a;迭代 class Solution {public List<List<Integer>> levelOrder(TreeNode root) {if …

C語言——輸入一個4位正整數,輸出其逆數。

#define _CRT_SECURE_NO_WARNINGS 1#include<stdio.h> int main() {int i,j 0;int a1,a2,a3,a4;printf("輸入一個4位正整數&#xff1a;\n");scanf("%d",&i);a1 i/1000; a2 i/100%10; a3 i/10%10; a4 i%10; printf("千位a1%d,百位a…

【JavaFx】利用JavaFx寫一個登錄頁面

以下是一個基本的JavaFX登錄頁面示例: import javafx.application.Application; import javafx.geometry.Insets; import javafx.geometry.Pos; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.co…

mysql的alter怎么使用?

在MySQL中&#xff0c;ALTER語句用于修改數據庫的表結構。下面是一些ALTER語句的示例用法&#xff1a; 1. 添加列&#xff1a; ALTER TABLE 表名 ADD 列名 數據類型; 2. 修改列的數據類型&#xff1a; ALTER TABLE 表名 MODIFY 列名 新數據類型; 3. 修…

新人工作方法論:高效率的工作

引言&#xff1a; 轉眼間入職半載&#xff0c;在工作期間曾迷茫、困惑&#xff0c;深深的感受到職場身份的轉變帶來的痛苦。痛苦的原因不僅僅包括學生時代自己悶頭做事的思維習慣與團隊合作需求的差異性&#xff0c;也包括缺乏體系的工作方法。 自己在網絡上查了一些方法論&a…

80C51單片機----數據傳送類指令

目錄 一.一般傳送指令&#xff0c;即mov指令 1.16位傳送&#xff08;僅1條&#xff09; 2.8位傳送 &#xff08;1&#xff09;目的字節為A&#xff08;累加器&#xff09; &#xff08;2&#xff09;目的字節為Rn(工作寄存器) &#xff08;3&#xff09;目的字節為direct…