JPA 的 EntityManager 什么时候提供优于普通 JDBC 的性能优势?

When does JPA's EntityManager give Performance Benefits over plain JDBC?

我正在为客户开发数据库应用程序。旧的应用程序代码在访问数据库的方式上非常不一致;在某些方法中,它使用 Hibernate 对象,在其他方法中,它直接创建 JDBC 连接并使用纯 SQL,在某些方法中,它创建 Hibernate 连接并使用这些连接来获取 JDBC 连接。无论如何,我们将彻底修改大量代码以使其保持一致。我们的客户听说过 JPA,并要求我们使用它,因为客户相信它会带来性能优势。

问题是,我对 JPA 的性能优势的理解是,最大的优势来自 JPA 的 EntityManager,因为它允许您在数据库调用之间将对象持久保存在内存中。但是,我们正在处理的应用程序不会是唯一访问数据库的应用程序,并且会 运行 在多个位置的多个实例中。此外,EntityManagers aren't thread-safe 所以我们甚至无法在同一应用程序的不同部分看到更改的数据。因此,看起来我们需要在每个方法中从 EntityManagerFactory 获取一个新的 EntityManager,并在方法完成时关闭它。因此,我们实际上无法在内存中持久保存对象很长时间,因为其他应用程序需要我们更改的数据并更改我们需要的数据。

当前代码如此混乱,以至于迁移到 JPA 无论如何都会在可维护性和一致性方面带来重大好处。但是,如果它不会提供性能优势,我们应该尽快让客户知道,以免他们失望。除了与 Persistance Contexts 相关的明显方式之外,JPA 是否还有其他方式提供性能优势?

我已经检查了 Whosebug 上的其他问题,但我发现的问题是关于大批量更改 (example here)。我们的客户希望一个应用程序所做的更改尽快对其他应用程序可见,因此我们的应用程序将进行几个小的更改,而不是偶尔进行批量更改。

谢谢。

JPA 不一定会给您带来优于普通 JDBC 的任何性能优势。它可能会对您的系统产生重大影响。这完全取决于您如何使用它。

听起来您已经在使用 Hibernate 了。 JPA 本身是一种规范,由许多供应商或提供商实施。 Hibernate 就是其中之一(也是我在工作中使用的 JPA2 提供程序)。

创建 EntityManagerFactory 可能需要一些时间。另一方面,创建 EntityManger 既快速又轻便。

如果您的性能不佳,您可以尝试分析代码以查看性能问题所在。

虽然我觉得转向单一访问层是个好主意,但它确实提高了可维护性和一致性。

JPA 是 OR/M 的标准,使用 ORM 框架或持久性产品的原因有很多,特别是使用 JPA 的原因有很多。

ORM 的原因

  • 从 SQL 结果集中删除 Java 中的所有 'hand' 映射 Java POJO大大减少了映射工作量。
  • 减少持久性代码库所需的工作量 域数据模型 and/or 关系数据模型更改。
  • 利用大型持久性库来避免开发解决方案 其他人已经解决的问题。
  • 避免低级 JDBC 和 SQL 代码。
  • 利用面向对象的编程和对象模型的使用。
  • 提供数据库和架构独立性。
  • 大多数 ORM 产品都是免费和开源的。
  • 多家企业为ORM提供支持和服务 产品。
  • 提供高端性能功能,例如缓存和 复杂的数据库和查询优化。

JPA 的原因

  • 它是 EJB3 和 Java EE 的标准和一部分。

  • 许多具有企业级支持的免费开源产品。

  • 跨应用程序服务器和持久性产品的可移植性 (避免供应商锁定)。可用的功能规范。

  • 同时支持 Java EE 和 Java SE。

ORM 可以成为一些人的热门话题,并且有很多 ORM 阵营。有些人认可特定的标准或产品。有些人不相信 ORM,甚至不相信一般的对象,而更喜欢 JDBC。有些人仍然相信对象数据库是可行的方法。就我个人而言,我会建议您使用您最熟悉的任何技术,但如果您从未使用过 ORM 或 JPA,不妨尝试一下,看看您是否喜欢它。下面的列表提供了关于为什么或为什么不使用 JPA 和 ORM 的几个讨论。 (来自维基百科)

Here is some useful linkes: JPA or JDBC, how are they different? , Java Persistence/Why use JPA or ORM?, JPA is great but damned slow