Комментарии 7
Hibernate proxy именно то место, где возникает большая часть N+1 запросов. В тот момент, когда происходит обращение к не инициализированным полям прокси объекта, возникает дополнительный запрос в базу данных. Это и есть +1 дополнительно к N.
А откуда, по-вашему, N берётся, если доп запрос на неинициализированные поля - это +1?
N это целевой набор запросов. В случае с книгой это запрос книги, но таких запросов может быть больше, 1,2,3…N. Целевой для определенного метода набор запросов в базу или в базы это N. Любой дополнительный запрос это +1.
Вы, кажется, вообще не понимаете о чем речь
В целом достаточно контструктивный ответ. Возможно мое определение проблемы N+1 отличается от вашего, но статья в целом про то, как прокси классы приводят к проблеме N+1, то есть к лишним запросам в БД. В статье говориться, что пока вы не обратитесь к любому не id полю прокси класса, дополнительных запросов в БД не произойдет. Дополнительные запросы в БД появляются именно в тот момент когда вы попробуете вызвать неинициализированное поле прокси класса.
В этой статье Hibernate, JPA, N+1 и лишние запросы в БД, более подробно описывается, что имеет в виду автор.
Вы либо ограничьте статью до proxy (и добавьте подробностей об этом механизме Java), либо уже раскрывайте проблему N+1, потому что сейчас статья обрывается не успев начаться.
И пожалуйста, прочитайте что такое проблема N+1 и в чем она заключается, чтоб не писать такую же глупость, что вы выше выдали.
Проблема N+1, по моему мнению, это любой дополнительный запрос в базу, который можно избежать если сразу достать из БД все необходимые данные, вы не согласны с такой постановкой вопроса?
В начале статьи указано, что описывается как прокси классы вызывают проблему N+1. Просьба уточнить, в чем именно глупость?
Если при запросе объекта из базы, мы не запрашиваем связанные сущности и не обращаемся к полям прокси класса, проблема N+1 не возникнет, она проявится в тот момент когда мы попытаемся вызвать неинициализированное поле связанной сущности. Если мы запросим в БД книгу (Book) без связанной сущности автор (Author) и попытаемся вызвать имя автора (book.getAuthor().getName()), в этом месте возникнет N+1, то есть дополнительный запрос в базу, которого можно было избежать, если сразу достать из базы автора книги.
Hibernate proxy and N+1