2011-01-13 38 views
8

Estoy recibiendo el siguiente excpetion:SQLException: violación de protocolo. Oracle JDBC problema de controladores

java.sql.SQLException: Protocol violation 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:145) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:190) 
at oracle.jdbc.driver.DatabaseError.throwSqlException(DatabaseError.java:286) 
at oracle.jdbc.driver.T4C80all.receive(T4C80all.java:766) 
at oracle.jdbc.driver.T4CPreparedStatement.do0all8(T4CPreparedStatement.java:216) 
at oracle.jdbc.driver.T4CPreparedStatement.fetch(T4CPreparedStatement.java:1225) 
at oracle.jdbc.driver.OracleResultSetImpl.close_or_fetch_from_next(OracleResultSetImpl.java:373) 
at oracle.jdbc.driver.OracleResultSetImpl.next(OracleResultSetImpl.java:284) 

El sistema Oracle se ejecuta en Solaris 10.2.0.3.0 5.10. El controlador jdbc se ejecuta en JDK 1.6.0_21 (si es importado, el java también se ejecuta en una máquina Solaris 5.10). He probado varios controladores delgados de Oracle incluyendo el último y el que parece coincidir exactamente con la versión Oracle.

La consulta que estoy ejecutando es bastante simple: "select * from_al_table order by key1, key2, key3" Luego iterando a través del conjunto de resultados y escribiendo en un archivo. La tabla tiene alrededor de 12 millones de filas, por lo que espero que el proceso se prolongue, pero parece que falle dentro de 5-15 minutos. Cada vez que lo ejecuto, explota en una fila diferente, así que no creo que el problema sea con los datos.

Encontré el registro de alerta de Oracle, pero no pude decir que haya algo relacionado con mi proceso. Aún así, no soy un experto en oráculos y tal vez haya una configuración de oráculo que necesito ver. Curiosamente, estoy ejecutando alrededor de cinco de este tipo de consultas (un par es un poco más complicado) en diferentes conexiones y solo dos más simples tienen este problema.

Se agradecerá cualquier ayuda o ideas sobre qué buscar para reducir el problema.

+0

Quizá se ejecuta fuera de la memoria en el servidor de base de datos? ¿Está cerrando correctamente los recursos en Java? ¿Esto sucede en la primera consulta ejecutada en su serie o en una de las últimas? – Riggy

Respuesta

6

Al parecer, agregar -d64 a la línea de comandos de java corrige este problema. Parece un problema de Solaris de 64 bits.

+2

Para mí, la actualización de mi controlador ojdbc solucionó esto. Salté a 11.2.0.2.0 y todo estaba bien. – Muel

5

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

Oracle traza

Este es el error de los archivos de seguimiento de Oracle

--- --- VIOLACIÓn PROTOCOLO DETECTADO

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

partir de aplicaciones registra

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

Síntoma

Esta excepción se producía ocasionalmente. El seguimiento de la pila tenía diferentes sql, lo cual era muy confuso. Ejecutar el sql con sql plus funcionó bien.

causa raíz

La excepción se produce cuando controlador de Oracle estaba tratando de exportar un conjunto de datos CLOB. Esto estaba sucediendo con solo unos pocos registros, no todos. Los datos como tal eran un archivo. Visualmente no pudimos distinguir qué estaba mal con esa información.

¿Por qué estábamos viendo errores en los registros de Oracle?

Entonces, si esto era un defecto del controlador, ¿por qué vimos el error en el seguimiento del oráculo? Lógicamente, los errores del controlador solo deben limitarse a los registros de la aplicación. La razón fue 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 cuando usará esa conexión no funcionaría y experimentaría un error. Es por eso que va a pasar en lugares al azar, con los usuarios al azar

solución

una solución a corto plazo era cambiar esta propiedad en la agrupación de conexiones. Estamos usando el grupo de conexiones DBCP.

Modificado de ds.setTestOnBorrow (false); a ds.setTestOnBorrow (true);

Ahora cuando el grupo devuelve una conexión dañada al grupo, antes de que la aplicación tome prestada esta conexión, se probará la validez. Si la conexión no se puede usar, el grupo se descartaría y luego la aplicación obtendría 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 de drivers

Promueve a OJDBC 12.1.0.2 12.1.0.1 de OJDBC resuelto el problema, incluso para las filas problemáticos.

Algunas otras enlaces para referencia

https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+caught+while+accessing+a+page+and+Oracle+DB+is+used

Cuestiones relacionadas