
隨著應(yīng)用程序(以及用于構(gòu)建它們的工具)變得越來越復(fù)雜,并且數(shù)據(jù)需求變得越來越大,開發(fā)團(tuán)隊(duì)開發(fā)出能夠在基線和規(guī)模上高效執(zhí)行的應(yīng)用程序至關(guān)重要。但是實(shí)現(xiàn)這個(gè)目標(biāo)有很多障礙:像 N+1 問題這樣的性能反模式可能會(huì)減慢或破壞最好的應(yīng)用程序。在本文中,我們將探討 N+1 問題、Java 中 N+1 問題背后的常見原因。
Java 中的性能反模式
性能反模式通常圍繞著在負(fù)載或規(guī)模上復(fù)合的低效或多余查詢。出現(xiàn)這些模式的原因多種多樣,但最終結(jié)果可能從性能差到級聯(lián)故障。我們今天看到的反模式稱為 N+1 問題。它以對數(shù)據(jù)庫的一系列過度請求為標(biāo)志,并經(jīng)常伴隨對象關(guān)系映射 (ORM) 工具。
什么是 N+1 問題?
N+1 問題,也稱為 N+1 選擇問題或 N+1 查詢,發(fā)生在服務(wù)從數(shù)據(jù)庫請求多行 (N) 數(shù)據(jù),然后單獨(dú)請求這些項(xiàng)目的相關(guān)數(shù)據(jù) N 次時(shí)。在分布式 Spring PetClinic 演示應(yīng)用程序的示例中,我們看到 vet.specialties 方法從數(shù)據(jù)庫中請求 24 行,然后循環(huán)并通過單獨(dú)的查詢從數(shù)據(jù)庫中請求 24 行。那是 24 次調(diào)用,加上對數(shù)據(jù)庫本身的 24 行數(shù)據(jù)的初始調(diào)用——或者,簡而言之,N + 1 次調(diào)用。 當(dāng)然,這些單獨(dú)的行調(diào)用可以通過單個(gè)調(diào)用來完成。
是什么導(dǎo)致 Java 應(yīng)用程序中的 N+1 問題?
有一些常見的罪魁禍?zhǔn)祝鼈兺ǔEc ORM 工具或框架以及它們生成查詢的方式有關(guān)。
1. ORM 框架
像 Java 這樣的面向?qū)ο笳Z言通常需要使用關(guān)系數(shù)據(jù)庫。這要么意味著開發(fā)人員或數(shù)據(jù)庫管理員需要編寫(優(yōu)化)SQL 請求,要么他們需要使用中間層,如 ORM 框架,為該數(shù)據(jù)庫生成兼容的請求。雖然功能強(qiáng)大,但 ORM 框架在創(chuàng)建未優(yōu)化查詢(包括 N+1 查詢)方面享有盛譽(yù)。
2. 延遲加載
默認(rèn)情況下,像 Hibernate 這樣的 ORM 框架可以在其生成的數(shù)據(jù)庫請求中使用 FetchType.LAZY。而且,由于這些查詢沒有保持會(huì)話,因此每次請求服務(wù)需要時(shí),都會(huì)對該數(shù)據(jù)庫進(jìn)行 N+1 次查詢。
3. 開發(fā)人員和數(shù)據(jù)庫管理員
事實(shí)是,這些 ORM 框架雖然很方便,但無法取代開發(fā)人員或數(shù)據(jù)庫管理員自己編寫請求的誠實(shí)努力。而且,由于 ORM 工具在開發(fā)人員沒有太多監(jiān)督的情況下生成查詢(除了功能),因此開發(fā)人員在生產(chǎn)中出現(xiàn)之前不會(huì)看到這個(gè)問題。 注:尊重原創(chuàng)文章,轉(zhuǎn)載請注明出處和鏈接 http://www.hebeijilong.cn/news-id-15970.html 違者必究!部分文章來源于網(wǎng)絡(luò)由培訓(xùn)無憂網(wǎng)編輯部人員整理發(fā)布,內(nèi)容真實(shí)性請自行核實(shí)或聯(lián)系我們,了解更多相關(guān)資訊請關(guān)注java培訓(xùn)頻道查看更多,了解相關(guān)專業(yè)課程信息您可在線咨詢也可免費(fèi)申請?jiān)囌n。關(guān)注官方微信了解更多:150 3333 6050