Spring данни Oracle JPA производителност с пагинация

Търся да извлека голям набор от данни с JpaRepository, подкрепен от таблица на Oracle. Възможностите за избор са да върнете колекция (List) или Page от обекта и след това да преминете през резултатите. Моля, обърнете внимание - Трябва да използвам всеки запис в този набор точно веднъж. Това не е „търсене-първия-от-голям-набор-данни-и-връщане“ операция.

Въпреки че идеята за страниране е привлекателна, производителността ще бъде ужасна (n^2), защото за всяка заявена страница, oracle ще трябва да изтегли предишни n-1 страници, което прави производителността прогресивно по-лоша, докато навлизам по-дълбоко в набора от резултати.

Моето разбиране за алтернативата List е, че целият набор от резултати ще бъде зареден в паметта. За oracle JPA spring няма резервен набор от резултати.

И така, ето моите въпроси

  1. Правилно ли е разбирането ми за начина, по който List работи с Spring Data? Ако не е, тогава просто ще използвам List.
  2. Ако съм прав, има ли алтернатива, която поточи набори от резултати на Oracle/JPA?
  3. Има ли трети начин, за който не знам.

person Prashant    schedule 29.06.2017    source източник
comment
Не използвайте обфускационен слой (известен още като ORM). Използвайте обикновен JDBC и повторете ResultSet - тогава няма нужда да пазите нищо друго освен текущия ред в паметта.   -  person a_horse_with_no_name    schedule 29.06.2017
comment
@a_horse_with_no_name, Благодаря. Мога да използвам JDBC с набор от резултати само за напред, но бих предпочел алтернатива, която използва Spring Data, тъй като това е, което използва останалата част от проекта.   -  person Prashant    schedule 29.06.2017
comment
Ако искате производителност и (памет) ефективност, тогава няма алтернатива на директно JDBC повикване.   -  person a_horse_with_no_name    schedule 29.06.2017
comment
Съгласен съм с @a_horse_with_no_name и можете да преминете през JPA, като използвате наименувани заявки docs.spring.io/spring-data/jpa/docs/current/reference/html/   -  person Rafik BELDI    schedule 29.06.2017


Отговори (1)


Методите за страници в SDJ извикват допълнително select count(*) from ... всяка заявка. Мисля, че това е причината за проблема. За да го избегнете, можете да използвате Slice вместо Page като параметър за връщане, например:

Slice<User> getAllBy(Pageable pageable);

Или можете да използвате дори List обекти с пагинация:

List<User> getAllBy(Pageable pageable);

Допълнителна информация

person Cepr0    schedule 30.06.2017