2011-06-22 5 views
6

En JDBC, los tipos Connection, Statement y ResultSet tienen un método getWarnings() que se especifica para producir la primera advertencia asociada a los objetos de ese tipo. La segunda advertencia y las subsiguientes, si existen, están encadenadas en la primera advertencia (si es si existe, null si no hay advertencias).¿Cuándo llamar a getWarnings() en Connections, Statements y ResultSets con JDBC?

Las especificaciones dicen que las advertencias asociadas con los objetos de estos tipos se borran después de ciertas acciones. Por ejemplo, las advertencias en un ResultSet se borran cuando se lee cada nueva fila.

El tipo SQLWarning es un subtipo de SQLException. Entonces, ¿la presencia de una advertencia se indica con una excepción? Y esa excepción estaría encadenada al objeto asociado si el tipo de tiempo de ejecución de la excepción es SQLWarning?

Lo que me pregunto es esto, y podría ser controlador específico, , ¿cómo sé cuando debo llamar getWarnings() y esperar una respuesta no null? Dicho de otra manera, ¿hay una advertencia presente en un objeto JDBC y está disponible con getWarnings() solo después de que ese objeto haya lanzado una excepción? (¿Y esa excepción es la advertencia?)

¿Debo llamar al getWarnings() para buscar advertencias después de cada operación JDBC "solo para estar seguro" si mi objetivo es observar cada advertencia?

Respuesta

4

Por otra parte, debe explícitamente de verificación de los avisos de SQL, porque que no se propagan a través de los estándar mecanismos de manejo de excepciones. Para hacerlo, llame al método getWarnings apropiado en el objeto JDBC relevante .

[reference]

Francamente, nunca he encontrado a mí mismo la comprobación de las advertencias de la historia. Puede ser que nunca he hecho algo serio.

7

SQLWarning objetos son una subclase de SQLException que se ocupan de las advertencias de acceso a la base de datos.

Las advertencias no detienen la ejecución de una aplicación, como lo hacen las excepciones; simplemente alertan al usuario de que algo no sucedió según lo planeado.

Una advertencia pueden notificarse en un objeto Connection, un objeto de Statement (incluyendo PreparedStatement y CallableStatement objetos), o un objeto ResultSet.

Cada una de estas clases tiene un método getWarnings, que se debe invocar el fin de ver el primer aviso informado sobre el objeto que llama:

SQLWarning warning = stmt.getWarnings(); 
if (warning != null) 
{ 
    System.out.println(\"n---Warning---n\"); 
    while (warning != null) 
    { 
     System.out.println(\"Message: \" + warning.getMessage()); 
     System.out.println(\"SQLState: \" + warning.getSQLState()); 
     System.out.print(\"Vendor error code: \"); 
     System.out.println(warning.getErrorCode()); 
     System.out.println(\"\"); 
     warning = warning.getNextWarning(); 
    } 
} 
3

Sí, que había necesidad de getWarnings explícitamente si realmente quiere para observar cada advertencia. ¿Pero por qué querrías hacer tal cosa?

Alternativamente, Spring's JdbcTemplate le ofrece la opción de registrar advertencias o lanzar SQLWarningException cuando hay advertencias.El comportamiento predeterminado es registrar advertencias porque, bueno, son advertencias. Espero que esto sea suficiente para tus propósitos, también.

+1

Estoy algo confundido por el "por qué quieres hacer tal cosa", seguido de la idea de registrar tales advertencias a través de un marco (Spring en este caso). ¿No haría el marco exactamente lo mismo que el código escrito a mano para observar cada advertencia? No veo la diferencia ... ¿o simplemente estás argumentando que hay menos trabajo en el programador al usar el marco en lugar de escribir el código de informe de advertencia? Seguramente, desde el punto de vista del rendimiento, ambos enfoques están ejecutando las mismas API de JDBC ... –

+1

Sí, se llamarían los mismos métodos JDBC. Solo quería decir que nunca me he encontrado buscando advertencias explícitamente. También traté de proporcionarle una forma fácil de registrar advertencias. – jtoberon

+1

A veces, las "advertencias" en realidad pueden ser bastante serias. Hace años trabajé en un proyecto que usaba Sybase, y resultó que al insertar un valor numérico como "37,000" en una columna 'NUMERIC (n, 2)' se ignoraría toda la fila del inserto, pero se produciría una advertencia, no lanzar una excepción. Esto fue una ocurrencia bastante rara que nuestras pruebas no captaron, y no fue hasta que el código estuvo en producción durante unas semanas que descubrimos que algunos de nuestros insertos estaban fallando silenciosamente. Terminamos envolviendo todos los objetos JDBC con envoltorios que lanzarían cada 'SQLWarning'. –

Cuestiones relacionadas