Google App Engine上的JDO与JPA for Java
我想用Struts2在Google App Engine上开发我的项目。 对于数据库我有两个选项JPA和JDO。 请问你们能给我build议吗? 两者对我来说都是新的,我需要学习它们。 所以我会在回复之后专注于一个。
谢谢。
JPA是Sun的持久标准,JDO是IMHO的死亡(实际上,它已经死了,但仍在移动)。 换句话说,JPA似乎是一个长期的更好的投资。 所以我想我会selectJPA,如果这两个对我来说都是新手。
GAE / J谷歌组有几个关于这个事情的post。 我会在那里search,看看人们的意见。 你会得到一个非常不同的信息,以上expression的意见。 还要关注BigTable不是RDBMS的事实。 使用正确的工具来完成这项工作
刚刚看到JPN和JDO之间的DataNucleus自己比较: – http://www.datanucleus.org/products/accessplatform_2_1/jdo_jpa_faq.html一个大开眼界。;
我是JDO的一个快乐的用户。 保持良好的工作人员。
声称JDO已经死了的人不是没有道理的。 以下是我在“专业EJB 3 Java持久性API”一书中读到的内容:“不久之后,Sun宣布将JDO简化为规范维护模式,并且Java持久性API将从JDO和其他持久性供应商中抽取出来,并成为单一支持标准前进“。 作者Mike Keith是EJB3的共同规范领导者。 当然他是JPA的大力支持者,但是我怀疑他是否有足够的偏见来说谎。
诚然,当这本书出版时,尽pipeJDO比JPA拥有更先进的技术特性,但大多数主要厂商都联合在JPA之后,而不是JDO。 这并不奇怪,因为在EE这个世界里,像IBM / Oracle这样的大公司也是大型的RDBMS供应商。 更多的客户在其项目中使用RDMBS而不是非RDMBS。 JDO正在死亡,直到GAE给它一个很大的提振。 这是有道理的,因为GAE数据存储不是关系数据库。 某些JPAfunction不适用于聚合查询,Join查询等拥有多对多关系的bigtable。 顺便说一下,GAE支持JDO 2.3,而只支持JPA 1.0。 如果GAE是您的目标云平台,我会推荐JDO。
为了logging,它是Google App Engine(GAE),所以我们使用Google规则而不是Oracle / Sun规则。
在它下面,JPA不适合GAE,它不稳定,不能按预期工作。 谷歌都不愿意支持它,但最低限度。
而对于其他部分,JDO在GAE中相当稳定,并且(在某种程度上)由Googlelogging。
不过,Google不会推荐其中的任何一个。
http://code.google.com/appengine/docs/java/datastore/overview.html
低级别的API会提供最好的性能,而GAE则是性能。
例如,添加10个实体
Python:68ms
JDO:378ms
Java本机:30毫秒
在JDO和JPA之间的比赛中,我只能同意数据核海报。
首先,也是最重要的,数据中心的海报知道他们在做什么。 他们毕竟是在开发一个持久的库,并且熟悉关系之外的数据模型,比如Big Table。 我确信hibernate的开发人员在这里,他会说:“我们所有的构build核心库的假设都与关系模型紧密结合,hibernate没有针对GAE进行优化”。
其次,JPA毫无疑问被广泛使用,作为官方Java EE堆栈的一部分有所帮助,但这并不一定意味着更好。 事实上,如果你阅读JDO,JDO对应于比JPA更高的抽象层次。 JPA与RDBMS数据模型紧密耦合。
从编程的angular度来看,使用JDO API是一个更好的select,因为你在概念上减less了很多。 只要您使用的提供程序支持底层数据库,您可以在理论上切换到任何您想要的数据模型。 (在实践中,你很less达到如此高的透明度,因为你会发现自己在GAE的对象上设置你的主键,你会绑定到一个特定的数据库提供商,如谷歌)。 它仍然会更容易迁移。
第三,您可以使用Hibernate,Eclipse Link,甚至GAE弹簧。 谷歌似乎已经做了很大的努力,让你使用你用来构build应用程序的框架。 但是,当他们将自己的GAE应用程序构build为运行在RDBMS上时,人们意识到的是它们很慢。 GAE的spring很慢。 您可以在这个主题上谷歌谷歌IOvideo,看看这是真的。
而且,坚持标准是一个很明智的做法,原则上我鼓掌。 另一方面,作为Java EE栈的一部分的JPA使得人们有时会失去select的概念。 意识到,如果您愿意,Java Server Faces也是Java EE堆栈的一部分。 这是一个令人难以置信的Web GUI开发解决scheme。 但最后,为什么人们,更聪明的人,如果我可以这样说,偏离了这个标准,而使用GWT呢?
在所有这一切中,我必须承认,JPA有一件非常重要的事情。 这是Guice和JPA的方便支持。 似乎谷歌在这一点上并不像往常一样聪明,并且满足于现在不支持JDO。 我仍然认为他们可以负担得起,最终Guice也会吞噬JDO,也可能不会。
去JDO。 即使你没有这方面的经验,也不难拿起,你将有一个新的技能在你的腰带!
在撰写本文的时候,我认为使用JDO
是非常糟糕的,因为唯一的实现供应商是Datanucleus
,其缺点是缺乏竞争,导致如下诸多问题:
- 关于
extensions
等一些方面的不太详细的文档 - 你通常会得到来自作者的讽刺性反应,比如(你是否检查过日志?可能是有这样的原因的),以及令人讨厌的反应
- 你不会在有用的时间内得到你的问题的答案,有时如果你在7天内得到答案,你应该考虑自己的幸运,即使在这里
StackOverflow
我一直希望有人能够自己开始实施JDO
规范,然后他们可以提供更多的东西,希望能够更多地关注社区,而不是总是为获得支持而付出代价,并不是说Datanucleus
作者只关心商业支持,但我只是说。
我个人认为,大Datanucleus
作者对大Datanucleus
本身和社区都没有任何义务。 他们可以在任何时候放弃整个项目,没有人能判断它,这是他们的努力和自己的财产。 但是你应该知道你在做什么。 你看,当我们的开发人员寻找一个框架使用,你不能惩罚或命令框架的作者,但另一方面,你需要你的工作完成! 如果你有时间写这个框架,为什么你要找一个呢?!
另一方面, JDO
本身也有一些复杂的东西,比如对象的生命周期以及不太直观和常见的东西(我认为)。
编辑:现在我也知道JPA
强制执行对象生命周期机制,所以如果您希望使用标准的ORM API(即JPA
或JDO
),看起来像处理持久化实体生命周期状态是不可避免的。
我最喜欢JDO
是能够在没有相当多的努力的情况下使用任何数据库pipe理系统。
GAE / J将在今年年底之前添加MYSQL。
JPA是要走的路,因为它似乎被当作一个标准化的API来推动,并且最近在EJB3.0中获得了动力.JDO似乎已经失去了动力。
都不是!
使用Objectify,因为更便宜(使用更less的资源),速度更快。 仅供参考: http : //paulonjava.blogspot.mx/2010/12/tuning-google-appengine.html
Objectify是专门为Google App Engine数据存储devise的Java数据访问API。 它占据了“中间地带”; 比JDO或JPA更易于使用和更透明,但比低级API方便得多。 Objectify旨在使新手立即生产,同时也暴露GAE数据存储的全部力量。
Objectify可以让你坚持,检索,删除和查询你自己的types对象。
@Entity class Car { @Id String vin; // Can be Long, long, or String String color; } ofy().save().entity(new Car("123123", "red")).now(); Car c = ofy().load().type(Car.class).id("123123").now(); ofy().delete().entity(c);
- 在开发服务器上configurationAppIdentityService的使用
- Google Blobstore与Google云端存储
- 根据文件夹结构,Google App Engine应用中的默认服务/模块可以是非默认服务/模块的兄弟吗?
- 有什么办法可以访问本地networking中的GAE开发应用程序服务器?
- 如何判断Google App Engine文档页面是否适用于标准或灵活的环境
- 如何在AppEngine上托pipe静态HTML文件?
- GWT中的基本file upload
- 谷歌应用程序引擎或amazon web services
- Google App Engine是否允许在服务器上创build文件和文件夹?