sql >> Base de Datos >  >> RDS >> Oracle

SQLException:infracción de protocolo. Problema con el controlador Oracle JDBC

Para los futuros usuarios de Google que tengan que visitar esta página, este es el problema que tuvimos. La excepción de violación del protocolo se registraba en los registros de la aplicación y en el seguimiento de Oracle.

Rastreo de Oracle

Este es un error de los archivos de seguimiento de Oracle

--- VIOLACIÓN DE PROTOCOLO DETECTADA ---

----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 ---
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) -----
        select xyz

Desde registros de aplicaciones

Caused by: org.springframework.jdbc.UncategorizedSQLException: SqlMapClient operation; uncategorized SQLException for SQL []; SQL state [72000]; error code [20000];

Síntoma

Esta excepción sucedía ocasionalmente. El seguimiento de la pila tenía un sql diferente, lo que era muy confuso. Ejecutar el sql con sql plus funcionó bien.

Causa raíz

La excepción se lanzó cuando el controlador de Oracle intentaba exportar datos CLOB. Esto estaba sucediendo con solo unos pocos registros, no con todos. Los datos como tales eran un archivo. Visualmente no pudimos distinguir qué estaba mal con esos datos.

¿Por qué veíamos errores en los registros de Oracle?

Entonces, si esto fue un defecto del controlador, ¿por qué vimos el error en Oracle Trace? Lógicamente, los errores del controlador solo deben limitarse a los registros de la aplicación. Las razones fueron que cuando ocurrió la violación del protocolo, la conexión se corrompió. Esta conexión se devolvió al grupo de conexiones. Cualquier usuario o trabajo que use esa conexión no funcionará y experimentará un error. Es por eso que sucederá en lugares aleatorios, con usuarios aleatorios

Solución

Una solución a corto plazo fue cambiar esta propiedad en el grupo de conexiones. Estamos utilizando el grupo de conexiones DBCP.

Cambiado de ds.setTestOnBorrow(falso);tods.setTestOnBorrow(verdadero);

Ahora, cuando el grupo devuelve una conexión corrupta al grupo, antes de que la aplicación tome prestada esta conexión, probará su validez. Si la conexión no se puede utilizar, el grupo se descartará y luego la aplicación obtendrá una conexión nueva/válida.

Si habilita los registros del grupo de conexiones, debería ver la excepción que normalmente se traga.

Actualización del controlador

Actualizar a OJDBC 12.1.0.2 desde OJDBC 12.1.0.1 resolvió el problema, incluso para las filas problemáticas.

Algunos otros enlaces para referencia

https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+capturada+mientras+accede+a+una+página+y+Oracle+DB+se+usa