2012-07-02 7 views
15

Sto eseguendo un inserto batch JDBC (inserendo 1000 righe circa alla volta) ogni volta che si esegue il programma. Ma non sono in grado di gestire l'eccezione generata da alcuni dei record correttamente.JDBC Gestione eccezioni inserimento batch

Supponiamo che il 100 ° record su 1000 record stia generando un'eccezione a causa di dati non validi o che la dimensione di alcuni valori superi la dimensione della colonna. Una volta che si è verificata l'eccezione, i record rimanenti non vengono inseriti e il programma non riesce tra.

Ciò che desidero è che anche se il 100 ° record genera un'eccezione, gli inserimenti rimanenti dovrebbero avvenire normalmente prima della fine del programma.

Non riesco a capire come ottenere ciò. Si prega di suggerire.

EDIT:

Ecco un esempio di codice che sto usando nella mia app per l'inserimento batch. Supponiamo che il set di risultati abbia circa 1000 record.

PreparedStatement ps = null; 
while(rs.next()){ 
    //Retrieve the value and set it to a Prepared statement 

    String name = rs.getString("Name"); 
    int age = rs.getInt("Age"); 
    ps.setInt(1, age); 
    ps.setString(2, name); 

    //Finally invoke addBatch 
    ps.addBatch(); 
} 

//Finally call the executeBatch method 
ps.executeBatch(); 

Se il record 100 è un'eccezione, allora voglio innescare il processo solo dal record di troppo 1000a 100 °. C'è un modo per fare questo in modo che possa riavviare il processo dal record che ha lanciato l'eccezione in poi fino alla fine di nuovo? Come ottenere questo?

+2

E il tuo codice è? – Alfabravo

risposta

0

Senza vedere alcun codice, il miglior consiglio che posso dare è quello di avvolgere un blocco try/catch attorno al codice che fa l'inserimento. Probabilmente dovrai anche impegnare i tuoi inserti (presupponendo una connessione transazionale) in ogni inserto. Ciò si tradurrà in un processo un po 'più lento, ma consentirà al tuo programma di continuare.

Penso che un approccio più pulito sarebbe provare a convalidare i record prima di inserirli. Questo non dovrebbe comportare un carico di elaborazione molto elevato se si parla solo di 1000 record alla volta.

+0

eventuali suggerimenti/aiuto sul mio post originale? – user182944

25

Si dichiara che si stanno eseguendo batch di istruzioni SQL, quindi presumo che si stia utilizzando executeBatch. Quando si invia un batch di istruzioni a executeBatch, alcune delle affermazioni potrebbero riuscire e alcune delle istruzioni potrebbero non riuscire. Se una dichiarazione fallisce, ciò non significa che il driver JDBC ripristini le istruzioni che hanno avuto successo. Il driver JDBC può scegliere di tentare di eseguire tutte le istruzioni nel batch se una dichiarazione fallisce o può decidere di interrompere l'esecuzione di istruzioni nel batch una volta che un'istruzione fallisce (sembra che il driver che si sta utilizzando selezioni di interrompere l'esecuzione di istruzioni come appena c'è un fallimento).

Quando una dichiarazione in un batch ha esito negativo, è necessario ottenere uno BatchUpdateException. Nel gestore delle eccezioni, è necessario chiamare getUpdateCounts. Ciò fornirà un array di int che indica il numero di righe aggiornate dell'istruzione, un numero Statement.SUCCESS_NO_INFO che indica che l'istruzione è riuscita ma non è stato disponibile il conteggio delle righe o un Statement.EXECUTE_FAILED che indica che l'istruzione non è riuscita. Se le prime 99 affermazioni hanno esito positivo, la centesima istruzione genera un errore e le istruzioni rimanenti non vengono eseguite, è necessario recuperare un array di 100 elementi in cui i primi 99 elementi indicano il successo e il 100 ° elemento indica Statement.EXECUTE_FAILED. Il tuo codice dovrebbe quindi riprovare quelle dichiarazioni che non sono state eseguite (in questo caso, dichiarazioni 101-1000).

+0

eventuali suggerimenti/aiuto sul mio post originale? – user182944