992
技術社區[雲棲]
《Spring Data實戰》——第1章 Spring Data項目 1.1為Spring開發人員提供的NoSQL數據訪問功能
本節書摘來自異步社區《Spring Data實戰》一書中的第1章,第1.1節,作者: 【美】Mark Pollack , Oliver Gierke , Thomas Risberg , Jon Brisbin , Michael Hunger著,更多章節內容可以訪問雲棲社區“異步社區”公眾號查看
第一部分 背景知識
第1章 Spring Data項目
Spring Data項目是在“Spring One 2010開發者大會”上創建的,該項目起源於當年早些時候Rod Johnson(SpringSource)和Emil Eifrem(Neo Technologies)共同參與的一場黑客會議。他們試圖把Neo4j圖形數據庫整合到Spring框架中,並評估了各種不同的方式。這次會議最終為初始版本的Spring Data Neo4j模塊奠定了基礎,這個新的SpringSource項目旨在迎合大眾對於NoSQL數據存儲日益增長的興趣,而這種趨勢一直持續到了今天。
從創立之初,Spring就為傳統的數據訪問技術提供了完善的支持。不管是使用JDBC、Hibernate、JDO、TopLink還是iBatis作為持久化技術,Spring都大大簡化了數據訪問層的實現。這種支持主要包括簡化基礎配置、資源管理並將異常轉換成Spring的DataAccessExceptions。這種支持多年以來已經逐漸成熟,最新版本的Spring也對這一層提供了很好的支持。
過去涉及數據持久化時,關係型數據庫是可供選擇的主要工具,所以Spring對傳統數據訪問的支持隻把關係數據庫作為唯一的目標。但隨著NoSQL的問世並成為工具箱中可行的替代方案,從支持開發人員的角度來看就有了新的領域需要補充。另一方麵,對於傳統關係型存儲的支持也還有許多需要改善的地方。這兩個方麵是Spring Data項目的主要驅動力。Spring Data包含NoSQL存儲的專有模塊以及為關係型數據庫提供更好支持的JPA和JDBC模塊。
1.1 為Spring開發人員提供的NoSQL數據訪問功能
盡管用NoSQL這個術語統稱一係列的新型數據存儲,但所有的這些存儲都有不同的特性和使用場景。具有諷刺意味的是,正是這種缺失特性的特點(缺乏對運行SQL 查詢的支持)命名了這一係列數據庫。由於這些存儲的特征非常不同,所以它們的Java驅動要使用完全不同的API才能充分發揮其特性和功能。如果試圖對這些差異進行抽象的話,就會失去每種NoSQL數據存儲能帶來的收益。圖形數據庫應該用來存儲高度關聯的數據;文件數據庫應該存儲樹狀以及聚合狀的數據結構;如果需要類似緩存的功能和存取模式,那應該選擇鍵/值(key/value)存儲。
Java EE(企業版)領域通過JPA提供了持久化API,這個API或許可以當作NoSQL數據庫前端實現的候選方案。但是令人遺憾的是,規範的前兩句話已經預示了這一點似乎不可能實現:
本文檔是關於在Java EE和Java SE中管理持久化和對象/關係映射的Java API規範。這項成果的技術目標是為Java應用開發人員提供一個對象/關係映射機製,借助它可以使用域模型來管理關係型數據庫。
這一主題在規範的後麵有清晰的體現,它定義了與關係型持久化領域緊密關聯的概念和API。@Table注解對NoSQL數據庫而言沒有太大的意義,@Column或@JoinColumn也是如此。在MongoDB這樣的存儲中如何實現事務API呢?要知道在這些環境中並沒有提供跨多文檔操作的事務語義。因此在NoSQL存儲之上實現JPA層,最好采用一個基於配置文件的API。
另一方麵,所有NoSQL存儲提供的特殊功能(地理空間功能、map-reduce操作、圖形遍曆)都需要以專有的方式去實現,因為JPA並沒有為它們提供抽象。因此我們可能會以“兩邊不討好”(worst-of-both-world)的局麵收場:有的部分可以通過JPA來實現,另外還需要使用專有的特性來重新啟用與特定存儲相關的功能。
上文排除了采用JPA作為這些存儲的抽象API的可能性。Spring生態係統中的各種項目為開發人員帶來了高效率以及一致的編程模型,我們依然希望將其用於簡化對NoSQL存儲的使用。為此,Spring Data團隊發布了如下使命宣言:
針對NoSQL和關係型存儲,Spring Data提供了基於Spring的熟知且一致的編程模型,同時保留特定存儲的特性和功能。
因此,我們決定采取略有不同的方法。不再試圖以單一的API將所有存儲抽象化。相反,Spring Data項目對不同的存儲實現都提供一致的編程模型,並使用了在Spring框架中大家已熟悉的模式和抽象。這樣,在使用不同的存儲時,會有一致的體驗。
最後更新:2017-05-31 12:01:59