日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線咨詢客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

MySQL 中使用 JPA + Hibernate 的 9 個(gè)高性能技巧

 

盡管有SQL標(biāo)準(zhǔn),但每個(gè)關(guān)系數(shù)據(jù)庫終將是唯一的,因此你需要調(diào)整數(shù)據(jù)訪問層,以便充分利用在使用中的關(guān)系數(shù)據(jù)庫。

在本文中,我們將介紹在使用帶有JPA和Hibernate的MySQL時(shí),為了提高性能,我們可以做哪些事情。

不要使用AUTO標(biāo)識(shí)符GeneratorType

每個(gè)實(shí)體都需要標(biāo)識(shí)符,標(biāo)識(shí)符惟一地標(biāo)識(shí)與該實(shí)體關(guān)聯(lián)的表記錄。JPA和Hibernate允許根據(jù)三種不同的策略自動(dòng)生成實(shí)體標(biāo)識(shí)符:

  • IDENTITY
  • SEQUENCE
  • TABLE

當(dāng)增加數(shù)據(jù)庫連接數(shù)時(shí),TABLE標(biāo)識(shí)符策略不會(huì)縮放。而且,即使是一個(gè)數(shù)據(jù)庫連接,標(biāo)識(shí)符生成響應(yīng)時(shí)間比使用IDENTITY或SEQUENCE大十倍。

如果你使用AUTO GenerationType:

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

Hibernate 5將會(huì)退回到使用TABLE生成器,這對(duì)性能不利。

你可以使用以下映射輕松解決此問題:

@Id
@GeneratedValue(strategy= GenerationType.AUTO, generator="native")
@GenericGenerator(name = "native", strategy = "native")
private Long id;

本地生成器將選擇IDENTITY而不是TABLE。

IDENTITY生成器禁用JDBC批處理插入

MySQL 5.7和8.0都不支持SEQUENCE對(duì)象,因此你需要使用IDENTITY。IDENTITY生成器可以防止Hibernate使用JDBC批量插入。

JDBC批量更新和刪除不受影響,只有INSERT語句不能被批處理,因?yàn)樵赑ersistence Context被刷新之前,INSERT語句已被執(zhí)行,從而Hibernate知道要分配給持久化實(shí)體什么實(shí)體標(biāo)識(shí)符。

如果要解決此問題,則必須通過不同的框架,如jOOQ,執(zhí)行JDBC批處理插入。

通過Docker和tmpfs加速集成測試

MySQL和MariaDB在不得不丟棄數(shù)據(jù)庫模式的時(shí)候,以及每次新的集成測試即將運(yùn)行因而重新創(chuàng)建它的時(shí)候,是非常慢的。但是,你可以在Docker和tmpfs的幫助下輕松解決此問題。

正如我在這篇文章中所解釋的,通過映射內(nèi)存中的數(shù)據(jù)文件夾,集成測試的運(yùn)行速度將與有內(nèi)存數(shù)據(jù)庫(如H2或HSQLDB)時(shí)的速度相同。

對(duì)非結(jié)構(gòu)化數(shù)據(jù)使用JSON

即使是在你使用RDBMS的時(shí)候,肯定也有很多次想要存儲(chǔ)非結(jié)構(gòu)化數(shù)據(jù):

  • 來自客戶端,如JSON的數(shù)據(jù),需要被解析并插入到我們的系統(tǒng)中。
  • 可以緩存的圖像處理結(jié)果以保存再處理

雖然本機(jī)不支持,但是你可以輕松地將JAVA對(duì)象映射到JSON列。甚至可以將JSON列類型映射到Jackson JsonNode。

更重要的是,你甚至不必編寫這些自定義類型,可以從Maven Central中抓取:

<dependency>
 <groupId>com.vladmihalcea</groupId>
 <artifactId>hibernate-types-52</artifactId>
 <version>1.0.0</version>
</dependency>

使用存儲(chǔ)過程來保存數(shù)據(jù)庫

在處理大量數(shù)據(jù)時(shí),將所有數(shù)據(jù)移入和移出數(shù)據(jù)庫并不是非常高效。不過,通過調(diào)用存儲(chǔ)過程對(duì)數(shù)據(jù)庫端進(jìn)行處理會(huì)好很多。

小心ResultSet流

SQL流在兩層應(yīng)用程序中是很有意義的。如果你要執(zhí)行ResultSet流,那么你也得注意JDBC驅(qū)動(dòng)程序。在MySQL上,你需要將Statement大小設(shè)置為Integer.MIN_VALUE。

然而,對(duì)于基于Web的應(yīng)用程序,分頁更為合適。JPA 2.2甚至引入了對(duì)Java 1.8 Stream方法的支持,但執(zhí)行計(jì)劃可能不如使用SQL級(jí)別分頁時(shí)那么高效。

PreparedStatements可能會(huì)被仿真

你可能以為,既然Hibernate默認(rèn)使用PreparedStatements,那么所有語句都是像這樣執(zhí)行的:

MySQL 中使用 JPA + Hibernate 的 9 個(gè)高性能技巧

 

實(shí)際上,更像是這樣執(zhí)行的:

MySQL 中使用 JPA + Hibernate 的 9 個(gè)高性能技巧

 

除非你設(shè)置了useServerPrepStmts MySQL JDBC驅(qū)動(dòng)程序?qū)傩裕駝tPreparedStatements將在JDBC驅(qū)動(dòng)程序級(jí)別進(jìn)行仿真以保存一個(gè)額外的數(shù)據(jù)庫。

始終結(jié)束數(shù)據(jù)庫事務(wù)

在關(guān)系數(shù)據(jù)庫中,每個(gè)語句都在給定的數(shù)據(jù)庫事務(wù)中執(zhí)行。因此,事務(wù)是不可選的。

但是,你應(yīng)該始終通過提交或回滾來結(jié)束當(dāng)前正在運(yùn)行的事務(wù)。忘記結(jié)束事務(wù)可能會(huì)導(dǎo)致持續(xù)被鎖很長時(shí)間,同時(shí)也會(huì)阻止MVCC清理過程回收不再需要的舊元組或索引條目。

分享到:
標(biāo)簽:MySQL JPA
用戶無頭像

網(wǎng)友整理

注冊時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績評(píng)定2018-06-03

通用課目體育訓(xùn)練成績評(píng)定