李文杰
(武漢職業(yè)技術(shù)學(xué)院 湖北省武漢市 430000)
從Hibernate OGM(OGM:Object Grid Mapping 縮寫)2011年發(fā)布以來,基于這個(gè)框架進(jìn)行關(guān)系型和非關(guān)系型數(shù)據(jù)混合使用的案例越來越多,大家對它的認(rèn)可度也逐步提升。這個(gè)框架現(xiàn)在還處于成長階段,隨著時(shí)間的推移它的功能逐漸得到進(jìn)一步完善,開發(fā)者也會越來越重視對Hibernate OGM框架的研究和學(xué)習(xí)。
Hibernate OGM 框架目前仍處于快速成長階段,目前已經(jīng)能很好的在項(xiàng)目中對接Mongodb、Neo4j、Redis 等非關(guān)系型數(shù)據(jù)。該框架項(xiàng)目的已經(jīng)完成了初始目標(biāo)以及部分中級目標(biāo),并開始服務(wù)于實(shí)際開發(fā)應(yīng)用了。它的最終目標(biāo)是為能兼容對接所有的非關(guān)系型數(shù)據(jù)庫,為開發(fā)者提供一個(gè)專注業(yè)務(wù)應(yīng)用的開發(fā)環(huán)境。(可以像訪問RDBMS 一樣訪問NoSQL 數(shù)據(jù)庫),鼓勵(lì)"傳統(tǒng)"企業(yè)更多的使用新的數(shù)據(jù)使用模式,并幫助正在使用NoSQL 的應(yīng)用更容易地?cái)U(kuò)展到傳統(tǒng)數(shù)據(jù)庫。
NoSQL 是非關(guān)系型的數(shù)據(jù)庫總稱。目前具有代表性并被實(shí)際應(yīng)用較多的產(chǎn)品有Mongodb、Neo4j、Redis 等。在海量數(shù)據(jù)讀取、數(shù)據(jù)分布式存儲、多重?cái)?shù)據(jù)種類集合、無固定應(yīng)用模式等需求場景中,這些數(shù)據(jù)庫已經(jīng)發(fā)揮了巨大作用,越來越多的WEB 應(yīng)用都需要這種大規(guī)模數(shù)據(jù)做支撐,而這些NoSQL 數(shù)據(jù)庫提供了無需多余操作就可以橫向擴(kuò)展的方便,從而使得我們對掌握NoSQL 技術(shù)的緊迫性得到了充分的認(rèn)識。
根據(jù)CPA(C:強(qiáng)一致性 A:高可用性 P:分布式容忍性)原則,我們可以將傳統(tǒng)關(guān)系型數(shù)據(jù)庫如Oracle、MySQL、DB2 等劃歸CP類型,強(qiáng)調(diào)數(shù)據(jù)一致性和可用性。然而,現(xiàn)階段大多數(shù)WEB 應(yīng)用不一定需要強(qiáng)一致性,所以大多數(shù)網(wǎng)站架構(gòu)的選擇了犧牲一些強(qiáng)一致性,強(qiáng)調(diào)AP,即高可用性和分布式,允許一些數(shù)據(jù)不一致甚至丟失。而Redis、Mongodb 為了追求高性能數(shù)據(jù)存儲解決方案,所以選擇了AP,即高可用性及分布式容忍性。綜上所述,目前沒有任何一種數(shù)據(jù)庫能完美滿足CPA 的全部要求,所以混合方式成為當(dāng)前大數(shù)據(jù)應(yīng)用的主流模式,也就是SQL 數(shù)據(jù)庫和NoSQL 數(shù)據(jù)庫一起使用?;谶@些先進(jìn)理念,Hibernate OGM 框架也因此獲得了良好的應(yīng)用前景和發(fā)展空間。
Hibernate 框架戰(zhàn)略是同時(shí)實(shí)現(xiàn)ORM 關(guān)系型數(shù)據(jù)庫連接與OGM NoSQL 數(shù)據(jù)庫連接,如Mongodb、Redis 等。而OGM 的核心是提供將數(shù)據(jù)存儲到NoSQL 存儲中的JPA 引擎,目標(biāo)是提供相同的API,相同的語義(級聯(lián),關(guān)聯(lián)等),相同的查詢語言,支持的高級特性包括:事務(wù)、事件通知、高級查詢、分布式處理、offheap 及故障遷移等。Hibernate OGM 框架極好地降低了學(xué)習(xí)和應(yīng)用者進(jìn)入NoSQL 領(lǐng)域的門檻,它很好的隱藏了NoSQL 數(shù)據(jù)的存儲區(qū),讓開發(fā)者的應(yīng)用程序與數(shù)據(jù)區(qū)進(jìn)行了很好的分離,讓開發(fā)者的關(guān)注度重新專注到了應(yīng)用本身,開發(fā)者可以面對不同的NoSQL 數(shù)據(jù)庫重用相同的編程API,使用相同的對象生命周期語義以及(一定程度上)使用相同的查詢引擎。
圖1
使用Maven 作為構(gòu)建工具,在從網(wǎng)絡(luò)下載項(xiàng)目所需要的框架Hibernate OGM 模塊及其依賴項(xiàng)文件,并用于理嵌入式Neo4j 數(shù)據(jù)庫;這將引入所有其他必需的模塊,例如Hibernate OGM 內(nèi)核和Neo4j(一種基于Java 的圖形數(shù)據(jù)庫)驅(qū)動程序。
圖2
非關(guān)系型數(shù)據(jù)庫提供了四種模型:鍵-值存儲庫、大數(shù)據(jù)表實(shí)現(xiàn)、文檔存儲庫、圖形數(shù)據(jù)庫。在數(shù)據(jù)模型設(shè)計(jì)時(shí),我們將面對的不再是一張一張Table 二維數(shù)據(jù)表,而是一個(gè)個(gè)領(lǐng)域數(shù)據(jù)模型。我們可以設(shè)計(jì)兩個(gè)領(lǐng)域模型,兩個(gè)模型之間標(biāo)注出一對多或多對一的關(guān)聯(lián),通過創(chuàng)建實(shí)體類并用所需的元數(shù)據(jù)注釋它們來映射域模型。
同時(shí),Hibernate OGM 提供了如模擬序列、UUID 等幾種ID 生成策略,通常我們使用UUID 生成器為模型生成ID,可以確??绮煌琋oSQL 數(shù)據(jù)存儲的可移植性,并使ID 生成快速且可擴(kuò)展。此時(shí)我們的應(yīng)用數(shù)據(jù)屬于SQL 數(shù)據(jù)庫和NoSQL 數(shù)據(jù)庫混合使用,如果需要將數(shù)據(jù)從關(guān)系型數(shù)據(jù)庫移植到NoSQL 中,開發(fā)者只需要面對完全相同映射,無需擔(dān)心不同的類型數(shù)據(jù)庫的影響,這就是Hibernate OGM 框架提供的關(guān)系數(shù)據(jù)向非關(guān)系型數(shù)據(jù)之間的簡易遷移功能。
實(shí)體定義后需要對persistence.xml 文件進(jìn)行配置如下:
Neo4j 作為一種圖形數(shù)據(jù)數(shù)據(jù)庫,任何數(shù)據(jù)實(shí)體都將映射到相應(yīng)的節(jié)點(diǎn)。保存形式如圖1。
如果使用MongoDB 數(shù)據(jù)庫那么,數(shù)據(jù)實(shí)體將會以文件形式進(jìn)行保存。保存形式如圖2。
與Hibernate OGM 框架技術(shù)實(shí)現(xiàn)理念相近,如Kundera、Apache Gora、等框架技術(shù),在實(shí)際應(yīng)用中也廣泛被采用。
其中Kundera 框架支持對Cassandra、Hbase、MongoDB 等的非關(guān)系型數(shù)據(jù)庫的持久化操作以及關(guān)系型數(shù)據(jù)庫操作。采用的實(shí)現(xiàn)方式是將NoSQL 操作轉(zhuǎn)化為SQL 操作方式,讓程序員專注到Domain Model 設(shè)計(jì)與開發(fā)上,同樣實(shí)現(xiàn)了通過修改配置文件在各個(gè)數(shù)據(jù)庫服務(wù)器之間進(jìn)行切換操作。
Apache 基金組織旗下的Gora 框架項(xiàng)目則大力支持Apache HBase、Apache Cassandra 等非關(guān)系型數(shù)據(jù)庫服務(wù)器的應(yīng)用開發(fā),而且更新速度一直很高,現(xiàn)在已經(jīng)能夠提供0.9 版本的框架源碼了。
作為大數(shù)據(jù)信息時(shí)代,我們需要緊跟軟件技術(shù)發(fā)展的步伐,對其大數(shù)據(jù)應(yīng)用領(lǐng)域的各種技術(shù)進(jìn)行深入的學(xué)習(xí)和應(yīng)用。技術(shù)在不停發(fā)展,Hibernate OGM 也會不停變化。不停的跟蹤學(xué)習(xí)、測試、應(yīng)用,就是應(yīng)用該框架的開發(fā)者必須長期堅(jiān)持的過程。當(dāng)然,一個(gè)框架肯定不能滿足我們所有的應(yīng)用場景需求,所以我們必須深入了解其優(yōu)勢和缺陷,結(jié)合實(shí)際應(yīng)用進(jìn)行合理構(gòu)架。