FreeSql 教程 (六)批量插入數據

FreeSql 以 MIT 開源協(xié)議托管于 github:https://github.com/2881099/FreeSql

var connstr = "Data Source=127.0.0.1;Port=3306;User ID=root;Password=root;" + 
    "Initial Catalog=cccddd;Charset=utf8;SslMode=none;Max pool size=10";

static IFreeSql fsql = new FreeSql.FreeSqlBuilder()
    .UseConnectionString(FreeSql.DataType.MySql, connstr)
    .UseAutoSyncStructure(true) //自動同步實體結構到數據庫
    .Build(); //請務必定義成 Singleton 單例模式

[Table(Name = "tb_topic")]
class Topic {
    [Column(IsIdentity = true, IsPrimary = true)]
    public int Id { get; set; }
    public int Clicks { get; set; }
    public string Title { get; set; }
    public DateTime CreateTime { get; set; }
}

批量插入

var items = new List<Topic>();
for (var a = 0; a < 10; a++) items.Add(new Topic { Id = a + 1, Title = $"newtitle{a}", Clicks = a * 100 });

fsql.Insert(items).ExecuteAffrows();

執(zhí)行SQL如下:

INSERT INTO `tb_topic`(`Clicks`, `Title`, `CreateTime`) 
VALUES(?Clicks0, ?Title0, ?CreateTime0), 
(?Clicks1, ?Title1, ?CreateTime1), 
(?Clicks2, ?Title2, ?CreateTime2), 
(?Clicks3, ?Title3, ?CreateTime3), 
(?Clicks4, ?Title4, ?CreateTime4), 
(?Clicks5, ?Title5, ?CreateTime5), 
(?Clicks6, ?Title6, ?CreateTime6), 
(?Clicks7, ?Title7, ?CreateTime7), 
(?Clicks8, ?Title8, ?CreateTime8), 
(?Clicks9, ?Title9, ?CreateTime9)

內部設計

當插入大批量數據時县恕,內部采用分割分批執(zhí)行的邏輯進行驮俗。分割規(guī)則如下:

數量 參數量
MySql 5000 3000
PostgreSQL 5000 3000
SqlServer 1000 2100
Oracle 500 999
Sqlite 5000 999

數據:為每批分割的大小主卫,如批量插入 10000 條數據暇屋,在 mysql 執(zhí)行時會分割為兩批蟀悦。
參數量:為每批分割的參數量大小仁期,如批量插入 10000 條數據计螺,每行需要使用 5 個參數化蕾各,在 mysql 執(zhí)行時會分割為每批 3000 / 5蕊温。

分割執(zhí)行后袱箱,當外部未提供事務時,內部自開事務义矛,實現(xiàn)插入完整性发笔。

FreeSql 適配了每一種數據類型參數化,和不參數化的使用凉翻。批量插入建議關閉參數化功能了讨,使用 .NonoParameter() 進行執(zhí)行(有關 NoneParameter 在后續(xù)文章介紹)。

性能參考

image

API

方法 返回值 參數 描述
AppendData <this> T1 | IEnumerable<T1> 追加準備插入的實體
ToSql string 返回即將執(zhí)行的SQL語句
ExecuteAffrows long 執(zhí)行SQL語句,返回影響的行數
ExecuteIdentity long 執(zhí)行SQL語句前计,返回自增值
ExecuteInserted List<T1> 執(zhí)行SQL語句胞谭,返回插入后的記錄
ExecuteSqlBulkCopy void SqlServer 特有的功能,執(zhí)行 SqlBulkCopy 批量插入的封裝
ExecutePgCopy void PostgreSQL 特有的功能男杈,執(zhí)行 Copy 批量導入數據

系列文章導航

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末苞冯,一起剝皮案震驚了整個濱河市袖牙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌舅锄,老刑警劉巖鞭达,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異皇忿,居然都是意外死亡畴蹭,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門鳍烁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來叨襟,“玉大人,你說我怎么就攤上這事幔荒『觯” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵爹梁,是天一觀的道長右犹。 經常有香客問我,道長姚垃,這世上最難降的妖魔是什么念链? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮积糯,結果婚禮上掂墓,老公的妹妹穿的比我還像新娘。我一直安慰自己絮宁,他們只是感情好梆暮,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布服协。 她就那樣靜靜地躺著绍昂,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上窘游,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天唠椭,我揣著相機與錄音,去河邊找鬼忍饰。 笑死贪嫂,一個胖子當著我的面吹牛,可吹牛的內容都是我干的艾蓝。 我是一名探鬼主播力崇,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼赢织!你這毒婦竟也來了亮靴?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤于置,失蹤者是張志新(化名)和其女友劉穎茧吊,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體八毯,經...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡搓侄,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了话速。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片讶踪。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖泊交,靈堂內的尸體忽然破棺而出俊柔,到底是詐尸還是另有隱情,我是刑警寧澤活合,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布雏婶,位于F島的核電站,受9級特大地震影響白指,放射性物質發(fā)生泄漏留晚。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一告嘲、第九天 我趴在偏房一處隱蔽的房頂上張望错维。 院中可真熱鬧,春花似錦橄唬、人聲如沸赋焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽隆判。三九已至犬庇,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間侨嘀,已是汗流浹背臭挽。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留咬腕,地道東北人欢峰。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像涨共,于是被迫代替她去往敵國和親纽帖。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

推薦閱讀更多精彩內容