最常見(jiàn)的 Java Hibernate 性能問(wèn)題與過(guò)多或低效的數(shù)據(jù)庫(kù)查詢(xún)有關(guān)。 Hibernate
觸發(fā)這些過(guò)多查詢(xún)的原因有很多,但它們通常與下面常見(jiàn)的 Hibernate 性能問(wèn)題有關(guān)。想對(duì) Hibernate
性能問(wèn)題有更深入的了解,可以參加java培訓(xùn),在專(zhuān)業(yè)老師的指導(dǎo)下,你可以很快掌握java的更多特性。
1. SQL 語(yǔ)句記錄
每次你的數(shù)據(jù)庫(kù)被訪問(wèn)時(shí),Hibernate
都會(huì)默認(rèn)記錄該操作。但是,在一個(gè)使用良好的應(yīng)用程序中,訪問(wèn)給定數(shù)據(jù)庫(kù)的大量時(shí)間(通常是不必要的)可能會(huì)導(dǎo)致日志引擎出現(xiàn)問(wèn)題。在規(guī)模上,這些對(duì)多個(gè)數(shù)據(jù)庫(kù)的并發(fā)請(qǐng)求會(huì)使你的日志引擎成為性能瓶頸。
2. N+1 選擇問(wèn)題
當(dāng)使用默認(rèn)的 FetchType.LAZY 時(shí),Hibernate 容易出現(xiàn)過(guò)多的、透明的 N+1
查詢(xún)。因?yàn)椴樵?xún)不保持會(huì)話(huà),所以每次請(qǐng)求數(shù)據(jù)時(shí)它們都會(huì)針對(duì)數(shù)據(jù)庫(kù)執(zhí)行。對(duì)于請(qǐng)求大型數(shù)據(jù)集的查詢(xún),這可能意味著較長(zhǎng)的響應(yīng)時(shí)間,這也使得 Hibernate
不適合流數(shù)據(jù)集。
3. 個(gè)別實(shí)體更新
當(dāng)我們編寫(xiě)面向?qū)ο蟮拇a時(shí),我們習(xí)慣于以原子方式處理單個(gè)對(duì)象,更新它們并逐個(gè)操作它們。使用 Hibernate
很容易養(yǎng)成這種習(xí)慣,但是,開(kāi)發(fā)人員必須記住,對(duì) Hibernate 中的 Entity
對(duì)象進(jìn)行的每次更新都會(huì)導(dǎo)致執(zhí)行*實(shí)際的數(shù)據(jù)庫(kù)查詢(xún)*。請(qǐng)務(wù)必考慮將批量更改而不是單個(gè)更改推送到
EntityManager。在java培訓(xùn)中,培訓(xùn)課程不僅注重理論,更注重項(xiàng)目的實(shí)戰(zhàn)能力,能夠讓你快速適應(yīng)企業(yè)開(kāi)發(fā)的進(jìn)度,成為企業(yè)所需要的JAVA人才。
4. 熱切關(guān)聯(lián)
Hibernate 急切地獲取一對(duì)一的關(guān)系,通常會(huì)導(dǎo)致過(guò)多的查詢(xún)。如果你有多個(gè)表試圖與另一個(gè)表連接,Hibernate
將獲取整個(gè)表,而不是獲取適用的數(shù)據(jù)條目。默認(rèn)情況下,這是低效的。而且,根據(jù)表的大小、應(yīng)用程序的規(guī)模和必要的連接數(shù)量,這種低效的查詢(xún)可能會(huì)導(dǎo)致性能問(wèn)題。
5. Hibernate 會(huì)產(chǎn)生低效的查詢(xún)
許多開(kāi)發(fā)人員希望 Hibernate 能夠生成高效的查詢(xún)。不幸的是,許多自動(dòng)生成的 SQL 查詢(xún)效率低下。外賣(mài)?
Hibernate 無(wú)法生成優(yōu)于人工編碼查詢(xún)的查詢(xún)。對(duì)于某些團(tuán)隊(duì)來(lái)說(shuō),輕松生成可能是值得的。
但是,對(duì)于更大的團(tuán)隊(duì)或更大的應(yīng)用程序,那些低效的查詢(xún)(以及修復(fù)它們所需的開(kāi)發(fā)時(shí)間)可能會(huì)對(duì)應(yīng)用程序的性能和開(kāi)發(fā)構(gòu)成重大障礙。復(fù)雜和復(fù)雜的查詢(xún)幾乎總是更好地留給人類(lèi)開(kāi)發(fā)人員,Hibernate
始終擅長(zhǎng)一次針對(duì)相對(duì)少量記錄的簡(jiǎn)單 CRUD
操作。通過(guò)java培訓(xùn),會(huì)有關(guān)于Maven的使用技巧的課程,學(xué)好這些技巧,有助于更好地進(jìn)行開(kāi)發(fā)項(xiàng)目,少出問(wèn)題。
6. Hibernate 有鋒利的邊緣
對(duì)于大多數(shù) Java 技術(shù),我們鼓勵(lì)開(kāi)發(fā)人員通過(guò)親身體驗(yàn)來(lái)發(fā)現(xiàn)細(xì)節(jié)——但對(duì)于新開(kāi)發(fā)人員來(lái)說(shuō),hibernate
可能具有優(yōu)勢(shì)。在生產(chǎn)環(huán)境中運(yùn)行 Hibernate 而對(duì)技術(shù)沒(méi)有絕對(duì)的理解可能會(huì)產(chǎn)生災(zāi)難性的后果(想想刪除數(shù)據(jù)庫(kù))。
關(guān)于 Java Hibernate 的最終想法
復(fù)雜的數(shù)據(jù)結(jié)構(gòu)需要比 Hibernate 這樣的靈丹妙藥更直觀的東西,才能成功構(gòu)建高效、可擴(kuò)展的查詢(xún)。 Hibernate
提供的自動(dòng)查詢(xún)不如人工創(chuàng)建的查詢(xún)高效——而且該技術(shù)當(dāng)然不會(huì)取代數(shù)據(jù)庫(kù)管理員或數(shù)據(jù)科學(xué)家。參加以實(shí)戰(zhàn)項(xiàng)目為主要教學(xué)方法的Java培訓(xùn),可以有效地縮短同企業(yè)具體用人需求之間的差距,快速提升自己。