Платформа 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();