【編者按】關(guān)注 NoSQL 的動態(tài)發(fā)展很重要。NoSQL 的好處并不僅限于新的應用開發(fā)。在某些案例中,你可以見識到重新訪問現(xiàn)有的、傳統(tǒng)的框架帶來的積極效果们童,比如說你的 JPA 的實現(xiàn)馋嗜。本文系國內(nèi) ITOM 管理平臺 OneAPM 編譯呈現(xiàn)。
多年以前,筆者在為一家世界頂級汽車公司做電子商務網(wǎng)站項目時,曾經(jīng)碰到過一個聽起來像科幻故事的概念:通過實體類別來自動實現(xiàn)數(shù)據(jù)持久存儲。
是的,筆者說的就是現(xiàn)在大家都知道的分布式組件標準(Enterprise JavaBeans)宣羊。發(fā)布于1998年苛坚,后來被并入 Java EE 的技術(shù)規(guī)范枷莉,它引入了實體(Entity Beans)的概念危喉。當時的想法是提供一個開發(fā)框架薄嫡,讓開發(fā)者可以將他們的對象自動映射到相關(guān)表格哑蔫,這樣該框架就可以在數(shù)據(jù)庫中持續(xù)自動將應用程序數(shù)據(jù)持久存儲。這被稱為 ORM:對象關(guān)系映射今阳。
當時是21世紀初,大家還習慣于等待當時最牛的太陽微系統(tǒng)公司(Sun Microsystem)——跟現(xiàn)在蘋果公司的地位差不多——帶來各種重大發(fā)明窖维,不過那可真的是模式的變更琳轿。它是緊跟面向?qū)ο缶幊蹋∣bject Oriented programming)出現(xiàn)的概念,不過它本身對主流應用開發(fā)世界來說就是一個重大的模式轉(zhuǎn)變斯入。當時沪铭,在一個集中的數(shù)據(jù)庫中持久存儲數(shù)據(jù)的概念已經(jīng)得到廣泛接受,關(guān)系數(shù)據(jù)庫也有很多漆枚。服務器端 web 應用開始成為主流掖疮,當然倔幼,你還得選擇存儲數(shù)據(jù)的數(shù)據(jù)庫,雖然關(guān)系數(shù)據(jù)庫并不是唯一的選擇而咆,但它們是當時所謂的“桌面應用”的首選障癌。這些都表明哀托,應用存儲和檢索數(shù)據(jù)的唯一方式是通過執(zhí)行 SQL 查詢仓手。在很多情況下,這種操作是非常復雜的雨女。
與之相反氛堕,Java 完全是面向?qū)ο蟮陌镅埃粫焕斫鉃楸砀窈完P(guān)系抒蚜。關(guān)系數(shù)據(jù)庫很容易就能被其他過程式語言借助 SQL 來采用。當時,Java 還飽受微軟和太陽間的訴訟的影響,該訴訟涉及到 Java 和 IE 間的兼容性奋早。開發(fā)者們都在討論哪個平臺或者框架能夠勝出:Java 還是微軟新發(fā)布的 .NET盛霎。
在這種背景下,EJB 提出的自動持久存儲是個令人欣喜耽装,同時又極富創(chuàng)新的概念愤炸。不過,當時的硬件現(xiàn)實條件擺出了一個挑戰(zhàn):雖然這個概念不錯剂邮,但是當時的處理硬件尚未準備好摇幻。Java 的問題已經(jīng)足夠證明横侦,被認為是“老派做法”的運行解釋代碼并不會降低所有進程的速度挥萌。在 EJB 要求的多層額外管理中執(zhí)行這樣的代碼,更是超出想象枉侧。還有別忘了引瀑,我們說的是32位單核處理器時代,高端服務器的內(nèi)存也不過 256 MB 到512 MB!(參考 topdesignmag.com)
時間快進到2016年榨馁,Hibernate 已經(jīng)發(fā)布了第5版憨栽,根據(jù)最新調(diào)查,超過73%的 Java 開發(fā)是在某個 Java EE 框架下進行的翼虫。
自2009年起屑柔,隨著 JPA 2.0 的規(guī)范出臺,越來越多的應用從這種抽象概念中受益珍剑。Gavin King 于2001年開發(fā)的 Hibernate ORM 得到廣泛使用掸宛,更是起到了推動作用,這是由前 EJB2 式實體類別提供的更簡單的持久化能力實現(xiàn)方法招拙。由于被認證為2010 JPA 2.0 規(guī)范的一種實施方法唧瘾,Hibernate 成為應用開發(fā)者們廣泛推崇和使用的技術(shù)。
然而别凤,發(fā)布15年以來饰序,開發(fā)者論壇關(guān)于最初主題的討論依然有很多:如何改善 JPA 的性能表現(xiàn)。雖然硬件速度有了很大提升规哪,同樣的問題依然存在求豫。如今 JPA 成了主流技術(shù),影響著世界上數(shù)以萬計的系統(tǒng),這個問題就變得更加重要蝠嘉。ORM 架構(gòu)內(nèi)在的問題并沒有改變:將面向?qū)ο蟮氖澜缬成涞疥P(guān)系世界并不是個小任務猾蒂,需要付出大量的額外努力才能實現(xiàn)無縫對接。
很多年前是晨,Ted Neward 把 ORM 稱為“計算機世界的越南”肚菠,把它跟收益遞減規(guī)律聯(lián)系在一起:一開始看起來很好,但是你用得越多罩缴,要獲得額外收益就越難蚊逢。在某些時候,因為前期已經(jīng)付出了資金和時間箫章,你很難“放棄誘餌烙荷,轉(zhuǎn)身跑掉”。他甚至還建議同時使用 ORM 方案和直接的 SQL 方案(或者 JDBC)檬寂,這樣“就可以繞過那些 ORM 會帶來麻煩的地方”终抽。這跟性能表現(xiàn)有很大關(guān)系。
jhades.org 的成員在他們的博客中提出了一個很好的觀點桶至,他們說昼伴,ORM 給自己帶來的主要問題是挑戰(zhàn)(實時)同步兩個完全不同的數(shù)據(jù)結(jié)構(gòu)。表格镣屹、關(guān)系和面向?qū)ο筮@幾個數(shù)據(jù)結(jié)構(gòu)之間并沒有什么相似性圃郊。結(jié)果就是,傳統(tǒng)的關(guān)系數(shù)據(jù)庫管理系統(tǒng)在所有的 ORM 實施過程中的表現(xiàn)都有所降低女蜈,就是因為 SQL 與這些受益于 ORM 的應用之間沒有相似性持舆,也就是所謂的領(lǐng)域驅(qū)動設計(Domain Driven Design)。
但是如今伪窖,整個數(shù)據(jù)庫產(chǎn)業(yè)都在經(jīng)歷變革逸寓。過去15年來,你得很有勇氣覆山,才敢避開關(guān)系數(shù)據(jù)庫管理系統(tǒng)竹伸,使用其他備選方案來持久存儲數(shù)據(jù)——如果你能找到的話,更不要說你還要費盡力氣解釋自己為什么要這么做汹买。如今佩伤,大量 NoSQL 數(shù)據(jù)庫增加了計算機科學出現(xiàn)更多新模式的可能性。說 JPA 不能從中受益簡直是大錯特錯晦毙,而且筆者認為它絕對能從中受益生巡。從數(shù)據(jù)結(jié)構(gòu)的觀點來看,要在 JPA 實現(xiàn)方法中持久存儲數(shù)據(jù)见妒,很多 NoSQL 方法都更合理孤荣,效果也比表格或關(guān)系數(shù)據(jù)管理系統(tǒng)更好。
筆者的研究似乎表明這是真的。我們最近基于自己的鍵值存儲(key-value store盐股,縮寫為 KVS)數(shù)據(jù)庫引擎 c-treeACE V11 發(fā)布了一個新的 JPA 實現(xiàn)方法钱豁。最初的測試結(jié)果表明,在使用 c-treeACE 替代 SQL 數(shù)據(jù)庫后疯汁,性能提升了30%牲尺。
實現(xiàn)這種效果是通過有效利用一種智能映射方法,能夠識別出那些可以在低層級 KVS 中執(zhí)行的檢索幌蚊,從而避免繁冗谤碳、不必要的 SQL。由于 c-treeACE 是一種多模式數(shù)據(jù)庫溢豆,與數(shù)據(jù)庫互動的層(Java 持久存儲層蜒简,縮寫為 JPL)能夠在 SQL 和 NoSQL 之間自如轉(zhuǎn)換,從而優(yōu)化每次 query.z 的執(zhí)行漩仙。
總之搓茬,關(guān)注 NoSQL 的各種動態(tài)發(fā)展很重要。NoSQL 的好處并不僅限于新的應用開發(fā)队他。在某些案例中卷仑,你可以見識到重新訪問現(xiàn)有的、傳統(tǒng)的框架帶來的積極效果漱挎,比如說你的 JPA 的實現(xiàn)系枪。無論你是用 Hibernate雀哨,或者其他 ORM 框架磕谅,數(shù)據(jù)庫替換都會是一個低風險、小投入的項目雾棺。你可能會發(fā)現(xiàn)膊夹,你很快就能節(jié)省幾千美元。
OneAPM 能為您提供端到端的 Java 應用性能解決方案捌浩,我們支持所有常見的 Java 框架及應用服務器放刨,助您快速發(fā)現(xiàn)系統(tǒng)瓶頸,定位異常根本原因尸饺。分鐘級部署进统,即刻體驗,Java 監(jiān)控從來沒有如此簡單浪听。想閱讀更多技術(shù)文章螟碎,請訪問 OneAPM 官方技術(shù)博客。
本文轉(zhuǎn)自 OneAPM 官方博客
原文地址:https://dzone.com/articles/how-to-improve-performance-of-your-jpa-application