2009-05-29 14 views
8

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

+2

Che cosa ti impedisce di fare gli inserti uno per uno? Prestazione? –

+0

È possibile testare i vincoli in modo programmatico prima di aggiungere i dati alla coda batch? – Elijah

+0

Sì, vedere i tempi di elaborazione aggiornati nella domanda –

risposta

1

Stavo cercando qualche soluzione sulla linea di "Con il database Oracle il Driver sembra fermarsi al primo FAILURE, cioè quando 1000 righe sono in batch e il 100 ° fallito, voglio che vada avanti fino alla millesima riga." Fondamentalmente volevo sapere se questo può essere fatto con il driver JDBC Oracle.

Tuttavia una varietà di risposte sono stati proposti (la maggior parte/tutti che avevo già preso in considerazione) 1) Disabilitare i dati vincoli/Caricare/Rimuovere offendere righe/ripetere molte volte 2) fare tutto il controllo prima del caricamento dati 3) Ridurre la dimensione del lotto a 50 - 100.

Sfortunatamente il mio controllo non può essere eseguito prima di caricare e fare in modo che la dimensione del lotto sia 50 o 100 significa impiegare più tempo per eseguire le 5M righe che ho (infatti il ​​tempo totale aumentato a poche ore anziché 40 minuti con una dimensione del lotto di 1000). Ho fatto in modo di mantenere la dimensione del lotto di 1000 ACCETTANDO il problema come è e mettere il codice sotto un ciclo "while" e fare il lavoro fino a riempire tutte le righe.

Come ho detto, poiché non v'è NESSUN MODO CON ORACLE LOTTO JDBC procedere dopo il primo fallimento, la risposta a questa domanda sarà "non fattibile" e semplicemente accettare i vincoli e documentare il fatto che questo strumento è di circa 40 minuti per completare :)

1

Si potrebbe provare questo: Inizia con lotti di 50 o 100. (Scegli una dimensione in modo hanno una buona probabilità di essere processati con successo). Quelli che falliscono, si elaborano uno per uno.

Altre possibilità: disattivare i vincoli, caricare i dati, eliminare quelle righe che violano i vincoli.

1

dovrei controllare per vedere se c'è una violazione di vincolo, di inserire tale record se i vincoli non vengono violati.

2

È necessario inserire in una tabella di lavoro che non ha i vincoli, quindi eliminare o correggere ciò che sarebbe in violazione e INSERISCI SELEZIONA il resto nella tabella reale in una singola istruzione SQL.

0

Avere una tabella delle eccezioni e assicurarsi che il proprio proc non sollevi eccezioni ma salva tutte le eccezioni nel database. Al termine, la tabella delle eccezioni di query e i record non possono essere esaminati.

Problemi correlati