Java EE與NoSQL的未來

自一段時間以來,我一直在關注NoSQL的近期發展勢頭,似乎這個流行語也引起了企業Java界的某種關注。 即EclipseLink 2.4開始支持MongoDB和Oracle NoSQL 。 將EclipseLink作為JPA參考實現,您可能想知道這對Java EE 7意味著什么。這里簡短說明:即使我是JSR-342 EG的一部分,也并不意味著要成為正式聲明。 在下面的內容中,我僅嘗試總結自己對使用將來的Java EE版本進行NoSQL支持的個人經歷和感受。 非常感謝Emmanuel Bernard提供早期反饋! 很高興討論以下內容:

什么是NoSQL?

NoSQL是不符合關系數據庫或SQL標準的數據庫系統的分類。 大多數情況下,它們是根據存儲數據的方式進行分類的,并屬于諸如鍵值存儲,BigTable實現,文檔存儲數據庫和圖形數據庫之類的類別。 通常,對術語的定義不夠好,不足以將其簡化為支持單個JSR或技術的單個術語。 因此,找到合適的集成技術的唯一方法是深入研究每個類別。

鍵/值存儲

鍵/值存儲允許以無模式的方式存儲數據。 它可以存儲在編程語言或對象的數據類型中。 因此,不需要固定的數據模型。 顯然,這可以與JSR 338 (Java持久性2.1)和JSR 347 (Java平臺的數據網格)的部分相媲美,也可以與JSR 107 ( JCACHE – Java臨時緩存API )一起完成。

使用本地JPA2

JPA L2緩存也是主要用于緩存的對象。 JPA緩存API非常適合基本的緩存操作,而L2緩存在各種持久性上下文中共享實體的狀態(在實體管理器工廠的幫助下可以訪問該實體的狀態)。 2級緩存是持久性上下文的基礎,而持久性上下文對應用程序是高度透明的。 啟用2級緩存后,持久性提供程序將首先在持久性上下文中查找實體。 如果在此處找不到它們,則持久性提供程序將在下一個二級緩存中查找,而不是向數據庫發送查詢。 顯然,這里的缺點是,到今天為止,它僅與NoSQL一起用作某種“緩存”。 而不是代替RDBMS數據存儲。 考慮到此規范的范圍,將是一個很好的選擇:但是我堅信JPA旨在作為RDBS的抽象,而沒有別的。 如果必須對非關系數據庫提供某種支持,那么我們可能最終會擁有一個更高層次的抽象層,其中包含許多不同的持久性模式和功能(例如Spring Data )。 通常,在對象級別進行映射具有許多優點,包括考慮對象的能力以及讓基礎引擎根據需要驅動反規范化。 因此,將JPA減少到緩存功能可能是錯誤的決定。

使用JCache

JCache具有一個CacheManager來保存和控制Cache的集合,每個Cache都有它的條目。 基本的API可以認為具有類似地圖的功能,并具有其他功能(請參閱Greg的博客 )。 由于JCache被設計為“緩存”,并使用它作為針對NoSQL數據存儲的標準接口,因此乍一看并不適合。 但是,鑒于使用企業Java的非結構化基于鍵/值的數據的用例的性質,這可能是正確的集成方式。 NoSQL概念還允許使用“ RAM中的鍵值緩存”類別,該類別完全適合JCache和DataGrid。

使用DataGrids

該JSR提出了一個API,用于與內存中和基于磁盤的分布式數據網格進行交互。 該API旨在允許用戶以異步且無阻塞的方式在數據網格(PUT,GET,REMOVE)上執行操作,并返回java.util.concurrent.Futures而不是實際的返回值。 此刻的過程目前還不是很明顯(至少對我而言)。 因此,到目前為止,還沒有任何有關NoSQL鍵/值存儲集成的示例或概念。 除此之外,還有與JCache API相同的保留。

使用EclipseLink

EclipseLink的NoSQL支持基于自EclipseLink 1.0以來提供的以前的EIS支持。 EclipseLink的EIS支持允許將對象持久保存到舊數據庫和非關系數據庫。 EclipseLink的EIS和NoSQL支持使用Java連接器體系結構(JCA)來訪問數據源,這類似于EclipseLink的關系支持使用JDBC的方式。 通過創建EclipseLink EISPlatform類和JCA適配器,EclipseLink的NoSQL支持可以擴展到其他NoSQL數據庫。 目前,它支持MongoDB(面向文檔)和Oracle NoSQL(BigData)。 有趣的是,Oracle沒有首先解決鍵/值數據庫。 可能是因為可能與緩存功能(例如一致性)混淆。

基于列的數據庫

讀取和寫入使用列而不是行完成。 最著名的例子是Google的BigTable以及受BigTable啟發的HBase和Cassandra之類的東西。 BigTable論文說BigTable是一個稀疏,分布式,持久性,多維排序的Map。 例如,GAE僅適用于BigTable。 它提供了各種API:從“本地”低級API到“本地”高級API( JDO和JPA )。 Google使用了較舊的Datanucleus版本,似乎有很多限制可以刪除( 請參閱注釋 ),但仍然存在。

面向文檔的數據庫

顯然,面向文檔的數據庫最好由JSR 170 (Java的內容存儲庫)和JSR 283 (Java Technology API版本2.0的內容存儲庫)解決。 使用JackRabbit作為參考實現,這是一個有力的信號:) 到目前為止 ,對其他NoSQL文檔存儲的支持已不存在。 甚至Apache的CouchDB也沒有提供符合JSR 170/283的訪問文檔的方式。 唯一的缺點是,兩個JSR都不是性感的也不是前沿。 但是對我來說,這將是對面向文檔的數據庫的支持的正確選擇。反面是內容存儲庫API并不是應用程序的自然模型。 應用程序真的要處理Java中的節點和屬性嗎?域模型的概念對許多應用程序都適用,如果沒有機會使用它,那么最好直接使用本機并直接使用MondoDB驅動程序。

面向圖的數據庫

這種數據庫被認為是用于以圖形形式很好地表示關系的數據(元素之間相互關聯的關系數量不確定)。 主要針對任何一種網絡拓撲,最近被拒絕的JSR 357(社交媒體API)將是提供支持的好地方。 至少從用例的角度來看。 如果將那些面向圖形的DB視為數據存儲,則有兩種選擇。 如果Java EE持久性正朝著更通用的數據抽象層的方向發展,那么338或其后繼者將是提供支持的合適之地。 如果您對Coherence在內部的工作原理有所了解,并且需要做些什么才能將JPA放在首位,那么您也可以認為347非常適合它。 具有已經提到的所有缺點。 另一種選擇是為其提供單獨的JSR。 該類別中最杰出的代表是Neo4J,它本身具有易于使用的API,可以將您需要的所有內容直接直接包含到項目中。 如果需要通過應用程序服務器控制Neo4J實例,還需要考慮其他事項。

結論

總結一下:對于所謂的“ NoSQL”數據庫,我們已經有了很多東西。 將其集成到新的Java EE標準中的基礎工作很有希望。 嵌入式NoSQL實例的控制應通過JSR 322(Java EE連接器體系結構)完成,這是唯一允許的場所生成線程并直接從文件系統打開文件。 我并沒有大力支持該平臺具有與Spring對Spring Data所做的相當的通用數據抽象JSR。 對我而言,不同的NoSQL類別的概念與采用一種千篇一律的方法太不同了.NoSQL的主要痛點除了缺乏標準API之外,還在于用戶被迫通過以下方式進行非規范化和維護非規范化:手。

我希望看到的是對產品進行了一些較小的更改,以使它們更適合Java EE,并且還完成了與規范的集成。 最好簡單地定義不同的持久性類型,并通常定義可能受此影響的JSR,并相應地對它們進行noSQL處理。

對于愿意促進域模型的用戶(即,與原始NoSQL API相比,抽象級別更高),JPA可能是目前的最佳工具。 需要EclipseLink和Hibernate OGM用戶的反饋,以評估有效的方法和無效的方法。 從政治角度來看,追求347也可能是有意義的。特別是因為主要的主要參與者已經在這里出現。

真正困難的部分是查詢。每個系列是否應該有標準化的查詢API? 使用Java EE? 還是最好將其放置在NoSQL空間中? 很想閱讀您對此的反饋!

參考: JCG合作伙伴 Markus Eisele在Java企業軟件開發博客上的NoSQL with Java EE的未來 。


翻譯自: https://www.javacodegeeks.com/2012/05/future-of-nosql-with-java-ee.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/372782.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/372782.shtml
英文地址,請注明出處:http://en.pswp.cn/news/372782.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【C/C++開發】C語言實現函數可變參數

函數原型: int printf(const char *format[,argument]...) 返 回 值: 成功則返回實際輸出的字符數,失敗返回-1. 函數說明: 在printf()函數中,format后面的參數個數不確定,且類型也不確定,這些參數都存放在棧內.調用…

java postgresql json_java – 將PostgreSQL JSON列映射到Hibernate值類...

See PgJDBC bug #265.PostgreSQL對數據類型轉換過于嚴格,非常嚴格.它不會隱式地將文本轉換為類似文本的值,例如xml和json.解決此問題的嚴格正確方法是編寫使用JDBC setObject方法的自定義Hibernate映射類型.這可能有點麻煩,所以你可能只想通過創建一個較弱的強制轉換來使Postgr…

面向接口編程詳解(三)——模式研究

通過前面兩篇,我想各位朋友對“面向接口編程”的思想有了一定認識,并通過第二篇的例子,獲得了一定的直觀印象。但是,第二篇中的例子旨在展示面向接口編程的實現方法,比較簡單,不能體現出面向接口編程的優勢…

錯誤學習:Java + OSGi

最近,我致力于在OSGi環境中使Apache Hive工作。 雖然沒有被證明是小菜一碟(軟件對嗎?。。為什么我不感到驚訝? ),它引導我解決了各種Java和OSGi錯誤。 在這里,我列出了其中一些讓我有些吃力的東…

iOS多Targets管理

序言: 個人不善于寫東西,就直奔主題了。 其實今天會注意到多targets這個東西,是因為在學習一個第三方庫FBMemoryProfiler的時候,用到了,所以就搜索了一些相關資料,就在這里記錄一下。 可能每個人都會遇到這…

優化的34條定律

1.Minimize HTTP Requests 減少HTTP請求 圖片、css、script、flash等等這些都會增加http請求數,減少這些元素的數量就能減少響應時間。把多個JS、CSS在可能的情況下寫進一個文件,頁面里直接寫入圖片也是不好的做法,應該寫進CSS里,…

休眠提示:排序和排序

讓我們介紹另一個休眠性能提示。 你還記得以前的休眠的模式后 ? 我們有一個與一對多協會有關的星際飛船和軍官。 Entity public class Starship {Id GeneratedValue(strategyGenerationType.SEQUENCE) private Long id;public Long getId() {return id;}protected v…

java 基本類型 線程安全_java的基本類型和i++線程安全性的深入解析

在java中,除了long和double的8個字節、64位比特的變量外,其他的基本變量都是原子性的。java存儲模型要求獲取和存儲操作都為原子性,但是對于非volatile的long和double變量,jvm允許將64位的讀或寫劃分為兩個32位的操作。如果讀和寫…

MySQL配置文件mysql.ini參數詳解

my.ini(Linux系統下是my.cnf),當mysql服務器啟動時它會讀取這個文件,設置相關的運行環境參數。 my.ini分為兩塊:Client Section和Server Section。 Client Section用來配置MySQL客戶端參數。 要查看配置參數可以用下面…

微信公眾平臺和微信開放平臺的區別

自己也剛開始做微信開發,先寫寫自己的認識: 用微信公眾平臺可以做手機端H5頁面的微信登錄,微信支付 用微信開放平臺可以做PC端網頁的微信登錄。 轉載于:https://www.cnblogs.com/mafeng/p/5610770.html

java 傳遞bean_如何將bean作為參數傳遞給JSP標記?

我ve created a custom JSP tag that is supposed to accept a list of products to render, but I我無法弄清楚如何將列表傳遞給標簽 . 產品列表作為頁面范圍的bean存在 . Web應用程序使用Struts taglib在Struts 1.2.x中編寫 .這是我的代碼的簡化版本:renderProduc…

Business Component(BC)和Business Object(BO)

Siebel應用架構的一個成功的地方就是在應用里引入了BC,BO的概念,從而使得幾千張關系數據表能夠按照業務的含義組織成業務對象,對于業務人員而言具有了業務上的含義,而不僅僅是從技術人員的觀點來對待數據(就是關系表而…

NetBeans可用性提示

的Java IDE都來了,因為在很長的路要走天的JBuilder的 (盡管JBuilder中似乎是一個值得歡迎提前在時間)。 當今的Java IDE(例如NetBeans , Eclipse , IntelliJ IDEA和JDeveloper )是非常先進的工具…

一個JVM進程啟動后里面有幾個線程

在寫Java程序時,通常我們管只有一個main函數(而沒有別的Thread或Runnable的程序)叫單線程程序。但是我們寫的這個所謂的單線程程序只是JVM這個程序中的一個線程,JVM本身是一個多線程的程序,至少得有一個垃圾收集器線程…

WPF 反編譯后錯誤處理

1. 首先,手動創建一個WPF工程(WpfApplicationReflectorDemo) 2. 把生成的WpfApplicationReflectorDemo.exe 拖到ILSpy里 3.點擊 File -> Save Code...: 相應的代碼會生成到指定地方。 4. 打開應用程序,并且編譯它,此…

JavaFX 2 GameTutorial第1部分

介紹 我相信大多數軟件開發人員可能會在年輕人(年輕人)一生中的某一時刻被迫創建游戲來幫助他們學習編程語言(我知道我確實做到了)。 以前,我的第一臺計算機實際上是Franklin Ace 1000 ,后來是Apple [] 。 …

虛擬現實-VR-UE4-認識UE4

VR的火熱,讓每個人都想參與一下, 公司在展會上面搞了一個VR的Demo,關注度超出預期,使得公司高層決定來個VR項目 所以 關于UE4 百度百科地址:http://baike.baidu.com/link?urlmEmbwOcqEuqtkfdu9lNdxVtWAkv0Q6UHZ4VgIHr…

java concurrent 例子_[Java Concurrent] 并發訪問共享資源的簡單案例

EvenGenerator 是一個偶數生成器,每調用一個 next() 就會加 2 并返回疊加后結果。在本案例中,充當被共享的資源。EvenChecker 實現了 Runnable 接口,可以啟動新的線程執行 run() 任務,用于檢測所指向的偶數生成器是否每次都返回偶…

OSGI實戰第一章

第一章 解開OSGI的面紗 OSGI是什么?是Java平臺的一個模塊化層。模塊化:軟件應用程序的代碼被分割為表示獨立內容的邏輯單元,可簡化開發,可通過強化邏輯模塊的界限來提高可維護性。Java模塊化的不足a) Java使用訪問…

輕松完成Birt報告

這是使用Birt插件在Eclipse中構建報告的完整指南。 Birt或Business Intelligence and Reporting工具是一種無需編寫太多Java代碼即可生成報告的工具。 如果您使用的是ireport,那么您知道我在說什么:)(晶體報告..毫無意義&#xff…