Domanda

Attualmente lavoro nella distribuzione di un OFBiz ERP, siamo arrivati alla seguente problema:la parte del codice del framework chiama il gruppo di risultati.last() per conoscere il totale di righe del set di risultati.Utilizzando il Driver JDBC Oracle e v10 v11, tenta di cache di tutte le righe in memoria client, crash JVM, perché non hanno abbastanza spazio heap.

Dopo la ricerca, il problema sembra essere che la Oracle JDBC implementa il Cursore Scorrevole lato client, invece che nel server, attraverso l'utilizzo di una cache.Utilizzando il driver datadirect, che il problema è risolto, ma sembra che la chiamata al gruppo di risultati.last() prende troppo per completare, quindi, l'applicazione server interrompe la transazione

c'è un modo per implemente i cursori scorrevoli tramite jdbc oracle senza ricorrere ai driver datadirect?

e qual è il modo più veloce per conoscere la lunghezza di un dato gruppo di risultati??

Grazie in anticipo Ismael

È stato utile?

Soluzione

"che cosa è il modo più veloce per conoscere la lunghezza di un dato gruppo di risultati" L'UNICO modo per sapere davvero è a contarli tutti.Volete sapere quanti SMITH sono in rubrica.Li si contano.Se si tratta di un piccolo set di risultati, e subito è arrivata all', non è un problema.Ad ESEMPIO non Ci saranno molti Gandalfs nella rubrica, e probabilmente si desidera ottenere tutti comunque.

Se si tratta di un set di risultati, si potrebbe essere in grado di fare una stima, anche se non è generalmente qualcosa che SQL è ben progettato per.

Per evitare la memorizzazione nella cache l'intero set di risultati con il cliente, si può provare

select id, count(1) over () n from junk;

Quindi ogni riga avrà anche una colonna (in questo caso n) con il numero di righe nel set di risultati.Ma ci vorranno ancora la stessa quantità di tempo per arrivare al conteggio, quindi c'è ancora una forte possibilità di un timeout.

Un compromesso è avere le prime centinaia (o migliaia) di righe, e non preoccuparti per l'impaginazione di là di questo.

Altri suggerimenti

la tua proposta di "soluzione" con conte sostanzialmente raddoppia il lavoro fatto da DB server.Si deve innanzitutto a piedi attraverso tutto per contare il numero di risultati, e poi fare lo stesso + la restituzione dei risultati.Molto meglio è il metodo citato da Gary (count (*) (a) - analytics).Ma anche qui il risultato deve essere creato prima dell'uscita viene restituito al client.Quindi è potenzialmente rallentare una memoria di consumo per le grandi uscite.

Modo migliore a mio parere è selezionare solo la pagina che si desidera sullo schermo (+1 per determinare che il prossimo che esista), ad es.righe da 21 a 41.E un altro pulsante (caso d'uso) a contarli nel (raro) caso qualcuno ne ha bisogno.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top