java - JPA native 查询与 'pure' JPA 持久性

标签 java database performance orm jpa

我有一个场景,我需要将所有传入文件(平面文件、xml)记录到应用程序中。该日志表几乎不被使用,除非用于故障调查或监管目的等,并且会定期清除数据。

我们使用 JPA 2.0 来实现持久化。我们立即使用 entityManager.persist();flush 尝试了具有纯 JPA 持久性的初始原型(prototype)。但表现并没有达到预期。因此,我建议将 NativeNamedQueries 用于此操作,并且在测试中性能显着提高(300 毫秒对 47 毫秒)。

但是首席工程师有点坚持使用 NativeNamedQueries,说它与数据库耦合并且不易维护等等。

问题:

  1. 如果您必须做出决定,您对此有何看法?应用程序投入生产后,数据库或架构更改的频率如何?

  2. 还有其他提高性能的方法吗?性能对于此应用程序非常关键。

我开始编程才 4 年,但从未见过现有应用程序发生 DB 模式更改或 DB 提供程序更改。

注意:我们使用的是 EclipseLink 2.3 和 Oracle。这也是我们正在开发的一个新应用程序。以防万一这些要点使问题更清楚

最佳答案

How often does database or schema changes happen once the application goes to production ?

这对您手头的问题无关紧要。数据库模式的更改数量无关紧要。重要的是你的数据库模型的可维护性,它的设计有多好。如果没有进行足够的性能测试,大多数商业应用将会看到很多变化,这对大多数应用来说都是可悲的。

如果您正在编写典型的业务线应用程序,我希望在开发过程中出现对象模型和数据库模型之间某种形式的往返工程。您的 DBA 应该拥有并非常了解数据库模型,以便他们可以帮助或执行微调 ORM 框架发出的查询。请记住,您不能单独依赖 ORM 框架发出的查询。所有更改最好在开发和集成测试(如果有 UAT,如果有的话)环境中完成并测试,然后再推出生产环境,按照常识,所有更改都将在版本控制下。

关于将查询耦合到数据库的主题,这是您的企业必须做出的决定。如果您从事支持多个数据库的业务,那么您应该针对所有数据库进行测试。此外,您应该能够提供不同的发行版以支持不同的数据库;如果将本地查询放在特定于数据库的 orm.xml 文件中,例如 orm-oracle.xmlorm-mysql.xml,这会变得更容易等等,并在准备分发之前将文件重命名为 orm.xml。使用 Maven 或 Ant 将使提议的更改易于实现。

Is there any other way to improve performance? Performance is very very critical for this application.

这将取决于您设计对象和数据模型的程度、您对 ORM 框架的理解程度以及您“破坏”对象模型的意愿。

任何应用程序性能调整的第一步是始终测量两次并削减一次。您不能简单地遍历可能的解决方案列表并尝试其中的每一个,而不知道它们是如何工作的以及它们在什么情况下有用;好吧,如果您的企业愿意为此投入时间,您可以这样做,但通常情况并非如此。

首先,您需要了解 native 查询为何提供或出现* 以提供更好的性能。也许这与您只是插入数据这一事实有很大关系,对于 ORM 框架来说,简单地发出 INSERT 语句而不是从 HQL 或抽象查询构造一个语句会更好引擎盖下使用的符号;只有剖析器才能揭示差异。

如果上述情况属实,那么您可以重新考虑您的审计表是否必须由 ORM 框架管理。如果您的应用程序只负责写入这些表而不负责读取它们(并且很可能另一个应用程序负责读取条目),那么我怀疑不在 ORM 中管理这些表会提供更好的性能,尤其是如果您使用纯 JDBC 发出 INSERT 语句。原因很简单——如果你的 ORM 框架正在管理实体,那么它也负责管理持久化上下文(现在包括类和关联的表);没有 ORM 管理实体将可能导致根本不需要为审计条目更新持久性上下文的情况。

您可以采取其他性能调优措施的可能性很大,但正如我之前所说,这需要您了解分析器报告并估计哪些可能的选择对您的应用程序更好。

* 恐怕除非您发布基准测试以及您如何执行它们,否则我会对声明持怀疑态度。

关于java - JPA native 查询与 'pure' JPA 持久性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6882495/

相关文章:

java - 无法使用 @DateTimeFormat(模式 ="dd/MM/yyyy")转换 java.util.Date 中的字符串

python - .python-eggs 权限被拒绝

performance - 确定两个列表是否包含相同的数字项而不进行排序

javascript - 避免内存泄漏将内容加载到 iframe

java - H2:从备份文件恢复(内存中)数据库

java - Maven 和 Java Wiki 库的 NoClassDefFoundError

MySQL 外键 : Cannot add or update a child row: a foreign key constraint fails

java - 通过设置 BasicDataSource 属性 testOnBorrow=false 来提高 web app/rest-api 性能,有风险吗?

java - 什么是最好的视频处理编程语言?

mysql - 使用结果中的值来避免双重 MySQL 查询