访问GAE数据存储:使用JDO、JPA还是低级API?

4

您有没有关于最佳访问Google App Engine Datastore的建议?是通过JDO、JPA还是本地API呢?

JDO/JPA的明显优点是可移植到其他数据库引擎,但除此之外,是否有任何理由不直接使用Datastore API呢?

3个回答

7
我对JPA不是很了解,但我选择了JDO。如果你对它还不熟悉,我可以说它有一个相当陡峭的学习曲线和许多与GAE无关的东西。但你可以获得拥有关系,这使你能够拥有具有实际引用的类而不仅仅是数据存储ID。此外,JDO通过注释执行一些有用的操作,例如@Element(dependent = "true")注释,它可以允许你删除父对象并且JDO将删除所有其子对象,从而节省了大量工作。总的来说,GAE文档缺少许多需要使用JDO有效的知识,因此我会说阅读datanucleus文档至关重要,并特别关注获取组。
你也可以在这里找到大量简洁的JDO和JPA示例,涵盖几乎每种可能的场景。

最后,我想看一下Objectify和Twig这两个显然很受欢迎的替代框架,在我做出这个决定时在我提问中提到。

顺便说一下,关于对其他数据库的可移植性,我认为在GAE上担心可移植性有点误导人。尽管谷歌希望我们认为GAE代码是可移植的,但我认为这是一个幻想。您最终将编写针对谷歌提供的特定API组合的代码,这种组合可能在其他任何地方都不会使用,并且还要绕过GAE的许多限制和怪癖,因此我会忘记可移植性作为解决数据访问API的因素。实际上,如果我可以重新决定这个问题,我认为我会使用专门为GAE构建的数据访问框架,例如Objectify。


6
低级别的Datastore API并不是直接使用的,而是为其他框架与数据存储交互提供API。

此软件包包含一个低级别的数据存储API,主要面向框架作者。应用程序作者应该考虑使用提供的JDO或JPA接口来访问数据存储。

(来源)

其中一个这样的框架是Objectify,它是比JDO或JPA更简单的数据存储接口,专门为数据存储设计的。

对于appengine-jruby,他们推荐使用datamapper,但是你不能使用Ruby的序列化功能(=> memcache),因为它对于dm-appengine适配器来说是有问题的。谷歌的App Engine文档并不是非常出色... - Philip

4
我认为这取决于个人喜好。ORM解决方案(如JDO/JPA)通常更加舒适。另一方面,低级API允许完全自由,不受ORM的任何限制。当然,您需要编写更多的代码,并可能希望编写自己的数据存储抽象层。但是如果您以后需要优化某些内容,这可能会很方便。
当然,您可以开始使用JDO/JPA,如果您发现需要更多的灵活性,仍然可以重构代码的某些部分以使用低级函数。正如tempy所提到的那样,内部引用被保存为ID(当然,键也是如此)。
一般来说(在SQL世界中),很多人说通过使用低级功能,您可以更好地了解数据库,因此更好地了解优化。有很多人使用ORM,但却非常低效,因为他们认为ORM会为他们完成所有工作。因此,他们遇到了性能或维护问题。
最后,我认为无论您选择JDO/JPA还是低级别解决方案,都是一个适当的选择,如果您不确定,您应该确实查看可用的文档并阅读(博客)文章以了解最佳实践。
菲利普

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接