2011-02-10 9 views
12

Usando Connector/J, me gustaría hacer una inserción por lotes en una tabla maestra seguida por una inserción por lotes en una tabla de detalles (PreparedStatement.executeBatch() para ambos). No he encontrado mucha información en línea, por lo que estoy buscando comentarios de personas que tengan experiencia con esto.Uso de getGeneratedKeys con inserciones por lotes en MySQL con Connector/J

  1. ¿Puedo utilizar Statement.getGeneratedKeys() para obtener los ID de las filas recién insertadas en la tabla maestra para que pueda utilizarlos como claves externas en los insertos detalle?

  2. ¿Qué pasa si no cada consulta resultó en una inserción (por ejemplo, hubo un insert ignore o insert ... on duplicate key update consulta)? ¿Obtendré una fila en Statement.getGeneratedKeys() por cada declaración , o solo para las nuevas?

  3. ¿Cómo serán Statement.getGeneratedKeys() retorno hay un error con uno de los insertados registros maestros y continueBatchOnError se establece en true en la cadena de conexión?

  4. ¿Hay alguna diferencia en el comportamiento relacionado entre Connector/J versiones 5.0.x frente a 5.5.x? ¿Qué pasa con MySQL 5.0 vs 5.1?

  5. ¿Hay algún otro problema o problema que deba tener en cuenta?

  6. ¿Hay una mejor manera de hacerlo?

Respuesta

12

Bueno, realicé algunas pruebas. Connector/J 5.1 y MySQL 5.1.42, observo lo siguiente:

  1. Statement.getGeneratedKeys() funciona como se espera para las inserciones

  2. Si una fila se inserta o se actualiza (la matriz cuenta de actualización devuelto por executeBatch() retornos '1' o '2'), Statement.getGeneratedKeys() tendrá la clave para esa fila. Si la fila no se modificó (insert ignore o insert ... on duplicate key update que da como resultado una operación nula, executeBatch() devuelve 3), no hay una clave.

  3. El ResultSet devuelto por getGeneratedKeys tendrá las entradas para filas insertadas con éxito, según (2). No habrá una fila de clave generada para las inserciones fallidas (donde el valor de recuento de actualización es Statement.EXECUTE_FAILED)

  4. ?

  5. Tenga cuidado con rewriteBatchedStatements en la cadena de conexión JDBC. Si está configurado en true, cualquier falla dará como resultado que cada fila en el "fragmento" reescrito sea tratada como si hubiera fallado. Una forma de manejar esto es iterar las filas fallidas e intentarlas sin lotes.

  6. ?

+0

Tenga en cuenta que hay algunas limitaciones en la tabla - http://stackoverflow.com/q/7333524/1339987 – djechlin

Cuestiones relacionadas