Algoritmo con Pageable

di il
22 risposte

22 Risposte - Pagina 2

  • Re: Algoritmo con Pageable

    andbin ha scritto:



    Poi bisogna vedere se il page offset nel tuo caso è inteso 0-based o 1-based. NON lo posso sapere io.

    Dipende a QUALE livello verrebbe fuori un OutOfMemoryError. Se fosse il caso che tiri su tutti i record, es. 100000 e crei un ArrayList con 100000 oggetti allora sì, quello potrebbe causare un OutOfMemoryError, specialmente se ci fossero anche altre richieste concorrenti di quel tipo (sulla stessa o altre tabelle).

    Facendo un ciclo di next() "a vuoto" per scartare es. 90000 record non causa di certo (non credo) un OutOfMemoryError, semmai è inefficiente come tempistiche. Il "peso" maggiore comunque ce l'ha il DB perché deve fare una query su molti più record del necessario. La paginazione già nella query (con le clausole specifiche del DBMS) serve a evitare proprio questo.
    Veniva fuori proprio perché tiravi fuori tutti i record ed erano troppi. Moriva così, con questa eccezione.
    Comunque cantato vittoria troppo presto. Se faccio una select x where, da db restituisce 100 record. Il servizio dovrebbe restiuirne 30 a pagina 0 ma ne restituisce solo 16, poi a pagina 1 non parte dal 17 ma dal 31 e ne restituisce altri 16

    Edit: errorone mio. C'è solo il fatto che salta il primo record da prendere a questo punto
  • Re: Algoritmo con Pageable

    Test90 ha scritto:


    C'è solo il fatto che salta il primo record da prendere a questo punto
    Ripeto che nel mio abbozzo di esempio c'è solo da chiarire se nel tuo caso il page offset è 0-based o 1-based. Se lo si intende 1-based, il mio ciclo con partenza i=0 si "mangia" il primo record. Tutto qui.
  • Re: Algoritmo con Pageable

    andbin ha scritto:



    Ripeto che nel mio abbozzo di esempio c'è solo da chiarire se nel tuo caso il page offset è 0-based o 1-based. Se lo si intende 1-based, il mio ciclo con partenza i=0 si "mangia" il primo record. Tutto qui.
    E' da cosa lo si capisce se è 0-based od 1-based?
    comunque non mi è chiaro perché si mangia il primo recordo solo a pagina 0 e non uno ad ogni cambio...
  • Re: Algoritmo con Pageable

    Test90 ha scritto:


    E' da cosa lo si capisce se è 0-based od 1-based?
    Dipende da cosa si è stabilito per la paginazione, non lo posso sapere io nel tuo caso. Chi passa i dati per la paginazione può farlo in svariati modi:

    - passa una PAGINA 0 o 1-based e poi il SIZE della pagina
    oppure
    - passa un OFFSET 0 o 1-based e poi il SIZE della pagina
    oppure (caso più strano ma possibile)
    - passa un OFFSET iniziale 0 o 1-based e un OFFSET finale (0 o 1-based come il primo)

    Si tratta di scelte ....

    Se passa una pagina, generalmente nel backend poco prima della query c'è una logica che calcola il offset (è questo che realmente serve).
  • Re: Algoritmo con Pageable

    Mmm non lo so.
    da come ho capito e visto testando, l'utente inserisce il numero della pagina e basta.
    poi il size è di default a 30.

    Tutto ciò che ha a che fare con il mio pageable è in op. Ho provato a modificare da i=0 a i=1, ma non va cmq, anche se con errore differente
  • Re: Algoritmo con Pageable

    Test90 ha scritto:


    da come ho capito e visto testando, l'utente inserisce il numero della pagina e basta.
    Sì ma dipende cosa viene poi passato fisicamente all'applicazione: la pagina o direttamente un offset? Cioè CHI calcola l'offset?

    Test90 ha scritto:


    Tutto ciò che ha a che fare con il mio pageable è in op.
    Sì ma quello che avevi postato all'inizio dice(va) poco/niente, perché NON spiega cosa viene passato alla applicazione, non spiega chi/come calcola l'offset ecc..
  • Re: Algoritmo con Pageable

    Piccola correzione, prima avevo scritto quel codice abbozzato ma senza ragionarci su più di tanto. Le due condizioni in && vanno scambiate!!
            // salta i record iniziali non voluti
            for (int i = 0; i < pageOffset && rs.next(); i++)    // Se offset 0-based (altrimenti i=1 se 1-based)
                ;
    
            // prende i record della pagina
            for (int i = 0; i < pageSize && rs.next(); i++) {
                // estrai il record, mappa nell'oggetto "dto", aggiungi in lista ecc..
            }
    JDBC posiziona all'inizio il cursore PRIMA del primo record. Quindi se l'offset è 0-based e si chiede 0, allora 0<0 è false e il secondo operando NON lo valuta (non esegue neanche il rs.next() ). E il ciclo termina subito, quindi non sposta nulla del cursore.

    Lapsus mio (capita anche a me ... ).
  • Re: Algoritmo con Pageable

    andbin ha scritto:


    Piccola correzione, prima avevo scritto quel codice abbozzato ma senza ragionarci su più di tanto. Le due condizioni in && vanno scambiate!!
            // salta i record iniziali non voluti
            for (int i = 0; i < pageOffset && rs.next(); i++)    // Se offset 0-based (altrimenti i=1 se 1-based)
                ;
    
            // prende i record della pagina
            for (int i = 0; i < pageSize && rs.next(); i++) {
                // estrai il record, mappa nell'oggetto "dto", aggiungi in lista ecc..
            }
    JDBC posiziona all'inizio il cursore PRIMA del primo record. Quindi se l'offset è 0-based e si chiede 0, allora 0<0 è false e il secondo operando NON lo valuta (non esegue neanche il rs.next() ). E il ciclo termina subito, quindi non sposta nulla del cursore.

    Lapsus mio (capita anche a me ... ).
    Grazie mille, ora funziona correttamente.
Devi accedere o registrarti per scrivere nel forum
22 risposte