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.mzph.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…