Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Che cosa fa realmente il metodo Statement.setFetchSize(nSize) nel driver JDBC di SQL Server?

In JDBC, il 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, di conseguenza, la quantità di RAM utilizzata per l'elaborazione di ResultSet.

Intrinsecamente se viene chiamato setFetchSize(10) e il driver lo sta ignorando, probabilmente ci sono solo due opzioni:

  1. Prova un driver JDBC diverso che rispetti il ​​suggerimento per la dimensione del recupero.
  2. Guarda le proprietà specifiche del driver sulla connessione (URL e/o mappa delle proprietà durante la creazione dell'istanza di connessione).

RESULT-SET è il numero di righe di cui è stato eseguito il marshalling sul DB in risposta alla query. ROW-SET è il blocco di righe che vengono prelevate dal RESULT-SET per chiamata dalla JVM al DB. Il numero di questi le chiamate e la RAM risultante richiesta per l'elaborazione dipende dall'impostazione della dimensione del recupero.

Quindi, se RESULT-SET ha 100 righe e la dimensione di recupero è 10, ci saranno 10 chiamate di rete per recuperare tutti i dati, utilizzando circa 10*{row-content-size} RAM in qualsiasi momento.

La dimensione di recupero predefinita è 10, che è piuttosto piccola. Nel caso pubblicato, sembrerebbe che il driver stia ignorando l'impostazione della dimensione di recupero, recuperando tutti i dati in una chiamata (richiesta grande RAM, chiamate di rete minime ottimali).

Cosa succede sotto ResultSet.next() è che in realtà non recupera una riga alla volta dal RESULT-SET. Lo recupera dal ROW-SET (locale) e recupera il ROW-SET successivo (invisibilmente) dal server quando si esaurisce sul client locale.

Tutto questo dipende dal driver in quanto l'impostazione è solo un "suggerimento", ma in pratica ho scoperto che funziona così per molti driver e database (verificato in molte versioni di Oracle, DB2 e MySQL).