In JDBC, il metodo setFetchSize(int)
è molto importante per le prestazioni e la gestione della memoria all'interno della JVM poiché controlla il numero di chiamate di rete dalla JVM al database e corrispondentemente la quantità di RAM utilizzata per l'elaborazione ResultSet.
Intrinsecamente se setFetchSize (10) viene chiamato e il conducente sta ignorando, ci sono probabilmente solo due opzioni:
- provare un driver JDBC diverso che onorerà il suggerimento fetch-size.
- Controllare le proprietà specifiche del driver sulla connessione (URL e/o mappa delle proprietà durante la creazione dell'istanza di Connection).
Il set RISULTATO è il numero di righe inserite nel DB in risposta alla query. Il ROW-SET è il blocco di righe che vengono recuperate dal RESULT-SET per chiamata dalla JVM al DB. Il numero di queste chiamate e la RAM risultante necessaria per l'elaborazione dipende dall'impostazione della dimensione del recupero.
Quindi, se il risultato-SET ha 100 righe e il fetch-dimensione è 10, ci saranno 10 di rete chiama per recuperare tutti i dati, utilizzando circa il 10 * {fila-content-size} RAM in un dato tempo.
La dimensione di recupero predefinita è 10, che è piuttosto piccola. Nel caso pubblicato, sembrerebbe che il driver stia ignorando l'impostazione della dimensione del recupero, recuperando tutti i dati in una chiamata (requisito RAM elevato, chiamate di rete minime ottimali).
Cosa succede sotto lo ResultSet.next()
è che in realtà non recupera una riga alla volta da RESULT-SET. Esso recupera quello dal (locale) ROW-SET e recupera il successivo ROW-SET (invisibilmente) dal server quando si esaurisce sul client locale.
Tutto ciò dipende dal driver poiché l'impostazione è solo un "suggerimento", ma in pratica ho scoperto che questo è il modo in cui funziona per molti driver e database (verificati in molte versioni di Oracle, DB2 e MySQL).
fonte
2013-03-21 22:52:50
Non conosco Postgres ma ... l'impostazione di auto-commit non dovrebbe avere alcun riferimento su un'istruzione SELECT e/o su una query fetch-size (sono davvero non correlate). –
@jwaddell È questo? Se il commit automatico sulla connessione è attivato, setFetchSize non avrà alcun effetto. Anche vero per 'Oracle 11g'? –
Commit è una funzione di istruzioni DML (data-manipulation-language) come INSERT, UPDATE, DELETE nel database di commit a due fasi (2PC). Questo non ha nulla a che fare con le query, che è ciò che "fetch" è correlato a "SELECT". Quindi il valore di auto-commit (l'istruzione DML è auto-commit sull'esecuzione rispetto a dover eseguire separatamente un commit in seguito) non ha nulla a che fare con il recupero in Oracle, MySQL o SQLServer e probabilmente con qualsiasi altro RDBMS. –