Ho un requisito univoco con l'API Java-JDBC insieme al database Oracle. Ho autoCommit di default che è vero per Oracle e sto usando l'esempio simile a questo link.Problema di aggiornamento batch JDBC
Tuttavia, quando aggiungo, dico 1000 lotti e diciamo che ognuno di essi è inserto. E supponiamo che circa 20 record violino alcuni vincoli, voglio che il restante 980 diventi COMMITTATO (e quindi visibile a qualsiasi altra query che usi qualsiasi altra connessione) al database e ignori i 20 record. Nell'esempio precedente, quando una riga viola qualsiasi transazione, quindi , anche quando eseguo il commit nel blocco catch, la transazione si impegna solo fino al primo errore.
So che gli aggiornamenti batch devono essere eseguiti SOLO quando si è abbastanza sicuri che tutte le righe passeranno e l'elaborazione delle eccezioni non è una, ma sto pianificando di PATCH un database esistente, quindi una qualche "cattiva pratica" è ok :) Tutti i campioni di codice saranno molto apprezzati.
**** **** MAGGIORI DETTAGLI
utilizzando semplici inserimento/aggiornamento non va bene dal momento che sto elaborando vicino alle righe 3M così sto dosaggio ogni 1000 registrazioni. Semplicemente aggiungendo 1000 inserti in loop (ignorando le eccezioni) richiede più tempo (circa 5 secondi per ogni 1000 record) rispetto all'aggiornamento batch < 300 ms.
Problema: Con il database Oracle, il driver sembra fermarsi al primo errore, ovvero quando 1000 righe sono in batch e il 100 ° fallito, voglio che passi avanti fino alla millesima riga. Io penso che questo non può essere fatto in JDBC (con Oracle) Come lo link indica che solo pochi database supportano tale funzionalità e probabilmente Oracle non è uno
Che cosa ti impedisce di fare gli inserti uno per uno? Prestazione? –
È possibile testare i vincoli in modo programmatico prima di aggiungere i dati alla coda batch? – Elijah
Sì, vedere i tempi di elaborazione aggiornati nella domanda –