随着应用程序(以及用于构建它们的工具)变得越来越复杂,并且数据需求变得越来越大,开发团队开发出能够在基线和规模上高效执行的应用程序至关重要。但是实现这个目标有很多障碍:像 N+1 问题这样的性能反模式可能会减慢或破坏最好的应用程序。
在本文中,我们将探讨 N+1 问题、Java 中 N+1 问题背后的常见原因。
Java 中的性能反模式
性能反模式通常围绕着在负载或规模上复合的低效或多余查询。出现这些模式的原因多种多样,但最终结果可能从性能差到级联故障。
我们今天看到的反模式称为 N+1 问题。它以对数据库的一系列过度请求为标志,并经常伴随对象关系映射 (ORM) 工具。
什么是 N+1 问题?
N+1 问题,也称为 N+1 选择问题或 N+1 查询,发生在服务从数据库请求多行 (N) 数据,然后单独请求这些项目的相关数据 N 次时。
在下面分布式 Spring PetClinic 演示应用程序的示例中,我们看到 vet.specialties 方法从数据库中请求 24 行,然后循环并通过单独的查询从数据库中请求 24 行。
那是 24 次调用,加上对数据库本身的 24 行数据的初始调用——或者,简而言之,N + 1 次调用。 当然,这些单独的行调用可以通过单个调用来完成。