Платформа Play 2 2.2.4 (ebean): при вызове Page <>. Pagination генерирует несколько SQL-запросов на одну страницу.

Мы используем Play 2 Framework 2.2.4 (с интегрированным eBean ORM) в нашем проекте. Наша нумерация страниц выглядит так:

public static Page<Users> page(int pageNum, int pageSize) {
    Page<Users> page = find.where().findPagingList(pageSize).getPage(pageNum);
    return page;
}

...

Page<User> currentPage =  page(0, 10); // for example

а затем в виду:

@for(user <- currentPage.getList) {
    // display information for every user
    ...
}

Когда я включил запись SQL-запросов в консоль, я был удивлен - получить список пользователей для одной страницы Ebean делает SQL-запрос для КАЖДОЙ страницы!

Для наших 329 пользователей это означает всего 33 запроса SQL:

[debug] c.j.b.PreparedStatementHandle - select t0.user_id c0, t0.user_name c1, t0.first_name c2, t0.last_name c3, t0.user_full_name c4, t0.sex_id c5, t0.status c7, t0.role_id c8, t0.phone c9, t0.email c10 from users t0 order by user_id
limit 11
[debug] c.j.b.PreparedStatementHandle - select t0.user_id c0, t0.user_name c1, t0.first_name c2, t0.last_name c3, t0.user_full_name c4, t0.sex_id c5, t0.status c7, t0.role_id c8, t0.phone c9, t0.email c10 from users t0 order by user_id
limit 11 offset 10
[debug] c.j.b.PreparedStatementHandle - select t0.user_id c0, t0.user_name c1, t0.first_name c2, t0.last_name c3, t0.user_full_name c4, t0.sex_id c5, t0.status c7, t0.role_id c8, t0.phone c9, t0.email c10 from users t0 order by user_id
limit 11 offset 20
...
[debug] c.j.b.PreparedStatementHandle - select t0.user_id c0, t0.user_name c1, t0.first_name c2, t0.last_name c3, t0.user_full_name c4, t0.sex_id c5, t0.status c7, t0.role_id c8, t0.phone c9, t0.email c10 from users t0 order by user_id
limit 11 offset 320

С некоторыми экспериментами я обнаружил, что это множество запросов SQL появляется точно, если метод Page<T>.getList() звонит. Даже если это называется один без каких-либо других действий.

Я не понимаю - в чем причина всех этих запросов?

Это какая-то ошибка?

1 ответ

Решение

В Play 2.2.4 используется версия Ebean 3.2.2, а в этой версии Ebean используется стратегия "получить вперед", чтобы получить все страницы при вызове. getPage,

Вы можете изменить это, установив для свойства fetch forward значение false, например:

public static Page<Users> page(int pageNum, int pageSize) {
    Page<Users> page = find.where()
                           .findPagingList(pageSize)
                           .setFetchAhead(false)
                           .getPage(pageNum);
    return page;
}
List<Notification> notifications = Ebean.find(Notification.class).where()
                .eq("notification_belong_to_user_id", userId)
                .order().desc("notificationDate")
                .findPagedList(pageNo, (int) pageSize)
                .getList();
Другие вопросы по тегам