Google App Engine上的JDO vs JPA for Java

时间:2009-09-13 16:57:37

标签: java google-app-engine jpa jdo

我想用Struts2在Google App Engine上开发我的项目。对于数据库,我有两个选项JPA和JDO。请问各位建议我吗?两者对我来说都是新的,我需要学习它们。所以我会在回复后专注于一个。

感谢。

12 个答案:

答案 0 :(得分:32)

JPA是Sun的持久性标准,JDO是恕我直言的死亡(实际上,它已经死了但仍然在移动)。换句话说,从长远来看,JPA似乎是一项更好的投资。所以我想如果两个对我来说都是新的,我会选择JPA。

答案 1 :(得分:32)

GAE / J谷歌小组有几个关于这件事的帖子。我会在那里搜索并查看人们的意见。您将收到与上述观点截然不同的信息。还要关注BigTable不是RDBMS的事实。使用正确的工具

答案 2 :(得分:24)

刚刚看到DataNucleus自己对JPA和JDO的比较: - http://www.datanucleus.org/products/accessplatform_2_1/jdo_jpa_faq.html 令人大开眼界。

答案 3 :(得分:16)

我是JDO的快乐用户。保持好工作的人。

答案 4 :(得分:12)

声称JDO已经死亡的人并非没有价值。以下是我在Pro EJB 3 Java Persistence API一书中所读到的内容:“此后不久,Sun宣布将JDO简化为规范维护模式,并且Java Persistence API将从JDO和其他持久性供应商处获取并成为单一支持标准向前发展。“作者Mike Keith是EJB3的共同规范领导者。当然,他是JPA的大力支持者,但我怀疑他是否有足够的偏见来撒谎。

确实,当这本书出版时,大多数主要供应商都支持JPA而不是JDO,尽管JDO确实拥有比JPA更高级的技术特性。这并不奇怪,因为像EE / Oracle这样的EE世界中的大型企业也是大型RDBMS供应商。在他们的项目中,更多的客户使用RDMBS而不是非RDMBS。 JDO一直在奄奄一息,直到GAE给予了很大的推动。这是有道理的,因为GAE数据存储不是关系数据库。某些JPA功能不适用于bigtable,例如聚合查询,加入查询,拥有多对多关系。 BTW,GAE支持JDO 2.3,同时仅支持JPA 1.0。如果GAE是您的目标云平台,我会推荐JDO。

答案 5 :(得分:11)

据记录,它是Google App Engine(GAE),因此我们使用的是Google规则,而不是Oracle / Sun规则。

在它之下,JPA不适合GAE,它不稳定,并且不能按预期工作。谷歌不愿意支持它,但最低限度。

另一方面,JDO在GAE中相当稳定,并且(在某种程度上)由Google充分记录。

但是,Google不建议使用其中任何一种。

http://code.google.com/appengine/docs/java/datastore/overview.html

低级API将提供最佳性能,而GAE则与性能有关。

http://gaejava.appspot.com/

例如,添加10个实体

  

Python:68ms

     

JDO:378ms

     

Java Native:30ms

答案 6 :(得分:9)

在JDO与JPA之间的竞赛中,我只能同意数据核心海报。

首先,也是最重要的是,数据核的海报知道他们在做什么。毕竟他们正在开发一个持久性库,并熟悉除关系之外的数据模型,例如:大表。我确信hiber的开发人员都在这里,他会说:"构建我们的核心库时我们所有的假设都与关系模型紧密耦合,hibernate没有针对GAE进行优化"。

其次,JPA毫无疑问会得到更广泛的使用,作为官方Java EE堆栈的一部分有所帮助,但这并不一定意味着它更好。 实际上,如果您阅读它,JDO对应的抽象级别高于JPA。 JPA与RDBMS数据模型紧密耦合。

从编程的角度来看,使用JDO API是一个更好的选择,因为从概念上来说,你的妥协要少得多。如果您使用的提供程序支持底层数据库,您可以在理论上切换到您想要的任何数据模型。 (在实践中,你很少达到如此高的透明度,因为你会发现自己在GAE的对象上设置主键,你将自己绑定到特定的数据库提供者,例如google)。虽然迁移仍然会更容易。

第三,你可以使用Hibernate,Eclipse Link,甚至可以使用GAE。 Google似乎已经付出了巨大努力,允许您使用用于构建应用程序的框架。但人们在构建GAE应用程序时意识到他们在RDBMS上运行的原因是它们很慢。 GAE上的春天很慢。您可以针对此主题谷歌Google IO视频,看看它是否属实。

另外,坚持标准是一件很明智的事情,原则上我鼓掌。另一方面,JPA是Java EE堆栈的一部分,人们有时会失去他们的选择概念。 如果愿意,请实现Java Server Faces也是Java EE堆栈的一部分。对于Web GUI开发来说,这是一个令人难以置信的整洁解决方案。但最后,为什么人们,更聪明的人,如果我可以这样说,偏离这个标准而不是使用GWT?

在所有这一切中,我必须认为JPA有一个非常重要的事情。这就是Guice及其对JPA的便捷支持。似乎谷歌在这一点上并不像往常一样聪明并且满足,因为现在不支持JDO。我仍然认为他们可以负担得起,最终Guice也将吞没JDO,......或许不会。

答案 7 :(得分:6)

去JDO。即使你没有经验,也不难接受,你将掌握一项新技能!

答案 8 :(得分:6)

我认为在撰写本文时使用JDO是非常糟糕的,唯一的实施供应商是Datanucleus,缺点是缺乏竞争导致许多问题,如:

  1. 关于extensions
  2. 等某些方面的非常详细的文档
  3. 你通常会得到作者的讽刺回答(你有没有检查过这些日志?可能是因为有这些日志的原因)和讨厌的回应
  4. 你在有用的时间内没有得到你的问题的答案,有时如果你在不到7天的时间内得到答案,你应该认为自己很幸运,即使在StackOverflow
  5. 我一直希望有人自己开始实施JDO规范,然后他们可能会提供更多内容,并希望更多免费关注社区,而不是总是困扰关于支持支付,而不是说Datanucleus作者只关心商业支持,但我只是说。

    我个人认为Datanucleus作者对Datanucleus本身及其社区没有任何义务。他们可以随时放弃整个项目,没有人可以判断它们,这是他们的努力和他们自己的财产。但是你应该知道你正在进入什么。你看,当我们其中一个开发人员寻找使用框架时,你不能惩罚或命令框架的作者,但另一方面,你需要完成你的工作!如果你有时间编写该框架,为什么你会首先寻找一个框架?!

    另一方面,JDO本身有一些并发症,如对象生命周期和不太直观和常见的东西(我认为)。

    编辑:现在我也知道JPA强制执行对象生命周期机制,因此如果您希望使用标准ORM API(即JPA,它看起来像处理持久化实体生命周期状态是不可避免的。 }或JDO

    我最喜欢JDO的是能够毫不费力地使用任何数据库管理系统。

答案 9 :(得分:3)

GAE / J计划在今年年底之前添加MYSQL。

答案 10 :(得分:1)

JPA是一种可行的方式,因为它似乎是作为标准化的API推动的,并且最近在EJB3.0中获得了动力.JDO似乎已经失去了动力。

答案 11 :(得分:1)

既不!

使用Objectify,因为更便宜(使用更少的资源)并且速度更快。 仅供参考:http://paulonjava.blogspot.mx/2010/12/tuning-google-appengine.html

  

Objectify是专为此设计的Java数据访问API   Google App Engine数据存储区。它占据了“中间地带”;更容易   使用和比JDO或JPA更透明,但更多   比低级API方便。 Objectify旨在制作   新手立即生产,但也暴露了全部的力量   GAE数据存储区。

Objectify允许您持久存储,检索,删除和查询自己的类型对象。

@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);