首页 > 解决方案 > 使用具有最佳性能值的弹簧数据更新行的最佳方法是什么?

问题描述

我正在使用弹簧数据。现在我的任务是在应用程序的性能和数据一致性非常关键的部分更新实体。实体中有 isLocked 字段。许多事务和业务逻辑都在这个领域中继。我希望能够以最有效和最安全的方式更新此字段。

我看到两种方法:

  1. 使用@Query和 jpql 更新语句。这种方法有利于只对 db 执行一个请求。但我不确定交易安全。

  2. 在 java 中使用findByIdwith和修改字段。@Lock(LockModeType.PESSIMISTIC_WRITE)这种方法的缺点是至少有 2 个对 db 的请求,但由于锁定,跨国安全。

你会推荐什么?也许有不同的最合适的方法我不知道。

标签: javaspringjpaspring-data-jpaspring-data

解决方案


如果您要询问有效性,这两种选择都非常有效。因此,您的选择归结为非功能性需求。

您在问题中提到了性能;使用 Query 的选项肯定会更高效。不仅因为它最终会执行一次数据库调用而不是两次(如果你玩得聪明并且有多个要更新,你甚至可能会通过一次调用来获取一大堆记录),而且还因为检索一个实体修改它涉及到水合它并将其添加到实体管理器会话中,与简单的查询相比,这相当昂贵。也就是说,作为一般原则,您应该只在性能成为问题时根据性能做出决定(谷歌“过早优化”以获得更多信息)。

要考虑的另一个方面是鲁棒性。通常,实体不仅仅是一个愚蠢的数据存储。它包含逻辑和业务规则,并且肯定会有验证存在于您的代码库中,但不存在于您的数据库中。使用 Query 可以绕过所有这些,并迫使您在两个位置对这些业务规则进行编码;一次在您的域中,一次在您的查询中。即使现在您正在更新的字段是“愚蠢的”,假设它不会保持这种状态也不是一个糟糕的赌博。

三是可维护性。整个想法,像 JPA 这样的东西存在的原因,是因为“从存储库中获取项目,更改字段,并保存更改(或提交事务)”是这么简单的事情。出错的可能性较小,任何人都可以阅读和推理。如果您不打算使用它,为什么首先使用 JPA?


推荐阅读