性能之Hibernate大批量保存數(shù)據(jù)優(yōu)化

開心一笑

【跟我媽說這幾天特別郁悶网杆,心情糟透了。
我媽說:要不我給你拿錢你出去玩幾天啊碳却!
我立馬笑顏逐開:“好啊好啊”队秩!
媽:“開心了吧”!
我:“嗯嗯追城,媽刹碾,快點拿錢呀!”
媽:“你都開心了我還拿錢干啥座柱!”
我迷帜。。色洞∠非拢】

提出問題

真實項目中,批量插入數(shù)據(jù)性能優(yōu)化???

唯美圖片

解決問題

1.業(yè)務場景

1.1 業(yè)務描述

數(shù)據(jù)庫有一張表(pm_testcase)火诸,客戶有一份excel數(shù)據(jù)锦针,里面有3+萬條左右案例。現(xiàn)在需要解析excel里面的內(nèi)容置蜀,對每條數(shù)據(jù)進行校驗奈搜。比如:名稱長度校驗,編號校驗盯荤,用戶賬號是否存在檢驗等等馋吗。然后封裝成 List 集合,批量保存秋秤。

CREATE TABLE "public"."pm_testcase" (
"id" varchar(32) COLLATE "default" NOT NULL,
"code" varchar(50) COLLATE "default",
"name" varchar(200) COLLATE "default",
//....省略若干個字段
CONSTRAINT "pk_pm_testcase" PRIMARY KEY ("id")
)
WITH (OIDS=FALSE)
;

1.2 業(yè)務流程圖

流程圖片

2.項目現(xiàn)狀

2.1 問題一

在excel數(shù)據(jù)導入宏粤,循環(huán) List 集合,進行校驗時灼卢,存在大量的連接數(shù)據(jù)庫操作绍哎。

//循環(huán)excel的每一行
for (int j = sheet.getFirstRowNum() + 1,len = sheet.getLastRowNum(); j <= len; j++) {
    Row row = sheet.getRow(j);
    if (row == null) continue;
    if (StringUtils.isEmpty(getValue(row.getCell(6)))) resultBuffer.append("案例類型為空,");
    //....省略其他校驗操作...
    //連接數(shù)據(jù)庫
    SysUser sysUser = sysUserService.findById(id);
}

2.2 問題二

直接批量保存3萬多條數(shù)據(jù)鞋真。

List<PcsTestcase> pcsTestcases = new ArrayList<>();
// ......
//直接調(diào)用批量保存  
this.batchCreate(pcsTestcases);

2.3 問題三

批量保存時崇堰,利用UUID生成工具,給主鍵設置Id涩咖。找出Hibernate的先查詢后更新的機制觸發(fā)海诲,造成不必要的查詢損耗。

List<PcsTestcase> pcsTestcases = new ArrayList<>();
PcsTestcase pcsTestcase = null;
for (int j = sheet.getFirstRowNum() + 1,len = sheet.getLastRowNum(); j <= len;j++) {
    Row row = sheet.getRow(j);
    if (row == null) continue;
    pcsTestcase = new PcsTestcase();
    //看這里抠藕,重要:這里在插入數(shù)據(jù)時饿肺,設置主鍵Id
    pcsTestcase.setId(UUIDUtils.generate());
    pcsTestcase.setPmMilestoneId(pcsMainTask.getId());
}

3. 解決方法

3.1 問題一解決方法

對于問題一,除了避免在 for 循環(huán)體內(nèi)連接數(shù)據(jù)庫外盾似,我們可以利用 Map集合的緩存機制敬辣,把之后需要用到的數(shù)據(jù)加載到map集合中雪标。比如:依次性查詢出所有的用戶數(shù)據(jù)等等,存放在Map集合中溉跃。

3.2 問題二解決方法

對于問題二村刨,我們可以把所有數(shù)據(jù),每500條進行一次批量保存操作撰茎,速度會比一次性批量保存好嵌牺。具體如下:

if(j % 500 == 0 || j == len){
    this.batchCreate(pcsTestcases);
    pcsTestcases = new ArrayList<>();
}

3.3 問題三解決方法

對于問題三,由于Hibernate在進行插入時龄糊,會判斷數(shù)據(jù)是進行插入還是進行更新逆粹。如果模型的主鍵不為空,查詢數(shù)據(jù)后炫惩,再進行更新數(shù)據(jù)僻弹,否則,進行插入數(shù)據(jù)操作他嚷。因此蹋绽,我們在進行插入操作時候,不要設置模型的主鍵筋蓖,可以避免不必要查詢消耗卸耘。

pcsTestcase.setId(UUIDUtils.generate());

基本的優(yōu)化思路就是這樣了,大功告成~~~

讀書感悟

來自北宋名相寇準《六悔銘》粘咖,教人要及早覺悟悔改

  • 六悔銘
    官行私曲蚣抗,失時悔。
    富不儉用涂炎,貧時悔忠聚。
    藝不少學设哗,過時悔唱捣。
    見事不學,用時悔网梢。
    醉發(fā)狂言震缭,醒時悔。
    安不將息战虏,病時悔拣宰。

經(jīng)典故事

【一教授與農(nóng)民在火車上相對而坐,無聊之際烦感。教授說:我出一道題巡社,你若不知,給我5元手趣,如果你出一道題晌该,我若不知,給你500元如何?農(nóng)民同意朝群。教授問:月亮距地球多遠燕耿?農(nóng)民一言不發(fā)遞給教授5元。農(nóng)民問:上山三條腿姜胖,下山四條腿誉帅,是什么動物?教授苦思無解右莱,無奈給農(nóng)民500元蚜锨。農(nóng)民接過錢準備睡覺。教授追問:上山三條腿慢蜓,下山四條腿究竟是什么動物踏志?農(nóng)民一言不發(fā)遞給教授5元錢,然后睡覺了胀瞪。低學歷高智商针余,太可怕了!這就是許多沒學歷的人能成為老板凄诞,首富的原因圆雁。】

大神文章

【1】【Java/JDBC.ORM】 jdbc插入大量數(shù)據(jù)時優(yōu)化處理
【2】Hibernate批處理操作優(yōu)化 (批量插入帆谍、更新與刪除)
【3】用Java向數(shù)據(jù)庫中插入大量數(shù)據(jù)時的優(yōu)化

其他

如果有帶給你一絲絲小快樂伪朽,就讓快樂繼續(xù)傳遞下去,歡迎點贊汛蝙、頂烈涮、歡迎留下寶貴的意見、多謝支持窖剑!

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(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
  • 文/不壞的土叔 我叫張陵杠娱,是天一觀的道長挽牢。 經(jīng)常有香客問我,道長摊求,這世上最難降的妖魔是什么禽拔? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮室叉,結果婚禮上睹栖,老公的妹妹穿的比我還像新娘。我一直安慰自己茧痕,他們只是感情好野来,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著踪旷,像睡著了一般曼氛。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上令野,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天舀患,我揣著相機與錄音,去河邊找鬼气破。 笑死聊浅,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的现使。 我是一名探鬼主播低匙,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼碳锈!你這毒婦竟也來了顽冶?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤殴胧,失蹤者是張志新(化名)和其女友劉穎渗稍,沒想到半個月后佩迟,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體团滥,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年报强,在試婚紗的時候發(fā)現(xiàn)自己被綠了灸姊。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡秉溉,死狀恐怖力惯,靈堂內(nèi)的尸體忽然破棺而出碗誉,到底是詐尸還是另有隱情,我是刑警寧澤父晶,帶...
    沈念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

推薦閱讀更多精彩內(nèi)容