Grails list() — обработка нехватки памяти и ограничение результатов списка

Я столкнулся со следующими проблемами в Grails.

Вот мой код, в котором я пытаюсь получить список всех возможных данных и отобразить его.

def c = Abc.createCriteria()
def results = c.list(){
  eq("A", "a")
  eq("B", "b")    
}

Поскольку результаты огромны, он продолжает получать их и умирает. Я хочу ограничить выборку списка или установить для него максимальный размер.

Я пытался использовать maxResults(), но он действует как поздний фильтр.

я хочу поставить

  1. тайм-аут
  2. ограничить выборку
  3. если возможно, обработайте все данные, не сталкиваясь с ошибкой «Недостаточно памяти».

person Amy PrIce    schedule 12.06.2014    source источник


Ответы (2)


Я не уверен, что вы подразумеваете под «поздним фильтром», но, насколько я знаю, в запросе критериев следующее

maxResults(10)

идентичен

LIMIT 10

в SQL-запросе. Вы можете убедиться в этом, включив ведение журнала SQL. Другими словами, maxResults(X) ограничит количество записей, возвращаемых самим запросом.

person Dónal    schedule 12.06.2014
comment
Привет, Донал, под поздним фильтром я имел в виду, может быть, он получает весь список данных, а затем выбирает максимальное из них, указанное maxResults (x). Я даже пробовал то же самое, но это заканчивается проблемой нехватки памяти. - person Amy PrIce; 12.06.2014
comment
Я хочу ограничить огромные данные, прежде чем они выдадут ошибку нехватки памяти или тайм-аута. Или каким-либо образом я могу обрабатывать эти данные в list(), как показано в примере. - person Amy PrIce; 12.06.2014
comment
@AmyPrIce, как я уже сказал в своем ответе, maxResults не выполняет то, что вы называете поздним фильтром. Он ограничивает размер результатов, возвращаемых самим запросом. - person Dónal; 12.06.2014
comment
Я понимаю это, но все еще не уверен, почему время запроса истекает, когда нам приходится искать огромные файлы, даже если я дал maxResults (10) только как 10. - person Amy PrIce; 12.06.2014

Затем вы можете использовать разбиение на страницы

params.max = Math.min(params.int('max') ?: 10, 100)
def c = Abc.createCriteria()
def results = c.list(params){
    eq("A", "a")
    eq("B", "b")    
}

Посмотреть:

<g:paginate controller="myController" action="myAction" total="${results.totalCount}" />
person MKB    schedule 12.06.2014