2012-07-02 8 views
15

Estoy realizando una inserción por lotes JDBC (insertando 1000 filas de a la vez) cada vez que se ejecuta mi programa. Pero no soy capaz de manejar la excepción arrojada por algunos de los registros correctamente.JDBC Manejo de excepción de inserción por lotes

Supongamos que el 100º registro de 1000 registros arroja una excepción debido a que los datos no válidos o el tamaño de algún valor exceden el tamaño de la columna. Una vez que se ha producido la excepción, los registros restantes no se insertan y el programa falla entre.

Lo que quiero es que incluso si el 100º registro es una excepción, las inserciones restantes deben suceder como de costumbre antes de que termine mi programa.

No puedo entender cómo lograr esto. Por favor recomiende.

EDIT:

Aquí es un ejemplo de código que estoy utilizando en mi aplicación para la inserción por lotes. Supongamos que el conjunto de resultados tiene aproximadamente 1000 registros.

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(); 

Si el registro número 100 está lanzando una excepción, entonces yo quiero para desencadenar el proceso sólo a partir del registro demasiado 1000a 100a. ¿Hay alguna manera de hacer esto para que pueda reiniciar el proceso desde el registro que arrojó la excepción en adelante hasta el final otra vez? ¿Cómo lograr esto?

+2

¿Y su código es? – Alfabravo

Respuesta

0

Sin ver ningún código, el mejor consejo que puedo dar es ajustar un bloque try/catch alrededor de su código que hace la inserción. También es probable que necesite confirmar sus inserciones (suponiendo la conexión transaccional) en cada inserción. Esto dará como resultado un procesamiento un poco más lento, pero permitirá que su programa continúe.

Creo que un enfoque más limpio sería intentar validar previamente los registros antes de insertarlos. Esto no debería ser una gran carga de procesamiento si solo estamos hablando de 1000 registros a la vez.

+0

alguna sugerencia/ayuda en mi publicación original? – user182944

25

Usted indica que está ejecutando lotes de sentencias de SQL, así que supongo que está utilizando executeBatch. Cuando executeBatch un lote de declaraciones, algunas de las declaraciones pueden tener éxito y algunas de las declaraciones pueden fallar. Si una instrucción falla, eso no significa que el controlador JDBC revierte las instrucciones que tuvieron éxito. El controlador JDBC puede optar por intentar ejecutar todas las instrucciones en el lote si falla una instrucción o puede elegir dejar de ejecutar las instrucciones en el lote una vez que falla una instrucción (parece que el controlador que está utilizando elige dejar de ejecutar sentencias como pronto como hay una falla).

Cuando una instrucción en un lote falla, debe obtener un BatchUpdateException. En su controlador de excepciones, debe llamar al getUpdateCounts. Esto le dará una matriz de int que le indica cuántas filas se actualizó la instrucción, un Statement.SUCCESS_NO_INFO que indica que la instrucción tuvo éxito pero no hubo conteo de filas disponible, o un Statement.EXECUTE_FAILED indicando que la instrucción falló. Si las primeras 99 declaraciones tienen éxito, la declaración número 100 genera un error, y las instrucciones restantes no se ejecutan, debe obtener una matriz de 100 elementos donde los primeros 99 elementos indican éxito y el centésimo elemento indica Statement.EXECUTE_FAILED. Su código debería entonces volver a intentar aquellas declaraciones que no fueron ejecutadas (en este caso, declaraciones 101-1000).

+0

alguna sugerencia/ayuda en mi publicación original? – user182944

Cuestiones relacionadas