我应该使用哪个 EJB 3 持久提供程序?

Posted

技术标签:

【中文标题】我应该使用哪个 EJB 3 持久提供程序?【英文标题】:Which EJB 3 persisent provider should I use? 【发布时间】:2008-09-18 23:35:40 【问题描述】:

我在一个相当大的 J2EE 项目上使用 EJB 3,默认情况下,Netbeans 将实体 bean 的持久提供程序设置为 TopLink。可以选择将提供程序更改为以下之一,甚至添加新的持久性库:

休眠 科多 OpenJPA

您更喜欢使用哪个持久性提供程序?使用其他提供商有什么好处?

虽然 TopLink 看起来不错,但我找不到很多关于如何控制缓存等的好文档。任何帮助将不胜感激。

【问题讨论】:

【参考方案1】:

我只考虑使用两个 JPA 提供程序:

如果您想坚持使用标准 JPA,我会使用 EclipseLink。虽然 Toplink Essentials 是 JPA 1.0 的参考实现,但 EclipseLink 基本上继承了 TopLink Essentials 代码,并将成为 JPA 2.0 的参考实现(并在发布时与 Glassfish V3 捆绑在一起;预计在 2009 年 5 月围绕 JavaOne)。 TopLink Essentials 是 Oracle 商业 TopLink 产品的一个有点残缺的版本,但 EclipseLink 基本上具有 TopLink 的所有功能。

另一个选择显然是 Hibernate。它被广泛使用和成熟,但并不是我所看到的问题。例如,上次我查看了 Hibernate 与具有多个一对多热切关系的实体存在问题。我不知道 Hibernate 是否有与 EclipseLink 的批处理查询提示等效的功能,但它是处理此类问题的一个非常有用的功能。

Hibernate 当然也支持标准的 JPA。 Hibernate 的最大优势在于,如果您对它的工作原理有疑问,谷歌搜索很可能会为您找到答案。

老实说,除了上述两个提供商之外,我不会考虑其他任何东西。

【讨论】:

为什么不考虑 openJPA。每个实现都有其优点和缺点......【参考方案2】:

我强烈推荐 Hibernate,原因如下:

Java 世界中使用最广泛、最受推崇的开源持久层;庞大的活跃社区,并在大量任务关键型应用程序中大量使用。 如果您希望与应用程序的其余部分(例如 Spring 等)走不同的路线,那么您根本不需要将自己与 J2EE 或特定供应商联系起来,因为 Hibernate 仍然可以很好地发挥作用。

【讨论】:

【参考方案3】:

我发现 Hibernate 有很好的文档记录,并且得到各种缓存技术的良好支持。我在非 JPA 上下文中使用它的次数也比其他人多得多,所以我可能因此而对它有点偏见。

我用 TopLink Essentials 尝试过的几个小玩具项目也很成功,但我从未涉足缓存或任何需要提供者特定文档的事情。总的来说,我认为社区对此的支持较少,这也是我最终使用 Hibernate 的部分原因。

【讨论】:

【参考方案4】:

我使用休眠。它非常成熟,效果很好。我个人没有使用过其他任何一个,但我知道 Hibernate 是目前功能最齐全的 JPA 提供程序之一。也因为有这么多人在使用它,几乎我遇到的每一个问题,我都可以通过谷歌搜索快速找到解决方案。

【讨论】:

【参考方案5】:

我最近致力于使用 Kodo JPA 框架构建的大型企业应用程序。 Kodo 生成的 SQL 通常在处理大量数据时不太具有可扩展性。在我看来,它产生了太多带有外部连接的查询。考虑到在尝试扩展 kodo 时我们必须更改多少映射,我不建议将它用于大型企业应用程序。甚至与我们交谈过的 Oracle 代表也在试图让客户从 kodo 转向 TopLink。甲骨文可能会在未来逐步淘汰 kodo。

【讨论】:

【参考方案6】:

DataNucleus http://www.datanucleus.org 也是完全兼容的 JPA 提供程序,具有 JPA1 和一些预览版 JPA2 功能

【讨论】:

以上是关于我应该使用哪个 EJB 3 持久提供程序?的主要内容,如果未能解决你的问题,请参考以下文章

简单但很好的 EJB 模式

Java 持久性应用程序无状态与有状态

具有应用程序管理的持久性上下文的 Spring Boot

WAR 版本更改后运行 EJB 持久计时器

JSF、CDI 和 EJB 容器:应该使用它们的哪种组合?

Web 应用程序中的有状态 EJB?