PgJDBC ha alcune limitazioni per quanto riguarda i batch:
-
Tutti i valori delle richieste e tutti i risultati devono essere accumulati in memoria. Ciò include risultati di blob/clob di grandi dimensioni. Quindi la memoria libera è il principale fattore limitante per la dimensione del batch.
-
Fino a PgJDBC 9.4 (non ancora rilasciato) , I batch che restituiscono chiavi generate effettuano sempre un viaggio di andata e ritorno per ogni voce , quindi non sono migliori delle singole esecuzioni di istruzioni.
-
Anche in 9.4, i batch che restituiscono chiavi generate offrono un vantaggio solo se i valori generati sono di dimensioni limitate. Un unico
text
,bytea
ovarchar
non vincolato campo nel risultato richiesto costringerà il pilota a fare un viaggio di andata e ritorno per ogni esecuzione .
Il vantaggio del batching è una riduzione dei round trip della rete. Quindi ha molto meno senso se il tuo DB è locale nel tuo server dell'app. C'è un rendimento decrescente con l'aumento delle dimensioni del batch, perché il tempo totale impiegato nelle attese della rete diminuisce rapidamente, quindi spesso non è stressante cercare di creare batch il più grandi possibile.
Se stai caricando dati in blocco, prendi seriamente in considerazione l'utilizzo di COPY
API invece, tramite CopyManager
di PgJDBC , ottenuto tramite il PgConnection
interfaccia. Ti consente di trasmettere dati simili a CSV al server per un rapido caricamento in blocco con pochissimi round trip client/server. Sfortunatamente, è notevolmente poco documentato:non appare affatto nei documenti principali di PgJDBC, solo nei documenti API
.