Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

SQLException:violação de protocolo. Problema do driver JDBC Oracle


Para futuros googlers que visitaram esta página, aqui está o problema que tivemos . A exceção de violação de protocolo estava sendo registrada nos logs do aplicativo e no rastreamento do Oracle.

Rastreamento do Oracle

Este é um erro dos arquivos de rastreamento oracle

--- VIOLAÇÃO DE PROTOCOLO DETECTADA ---
----- Dump Cursor sql_id=1j5kjnkncpp xsc=0x2a053a2a0 cur=0x2a052f1cf0 ---
----- Current SQL Statement for this session (sql_id=1jjns4k6npp) -----
        select xyz

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

Sintoma

Essa exceção acontecia ocasionalmente. O rastreamento de pilha tinha um sql diferente, o que era muito confuso. Executando o sql com sql plus funcionou bem.

Causa Raiz

A exceção foi lançada quando o driver oracle estava tentando exportar dados CLOB. Isso estava acontecendo com apenas alguns registros, não todos eles. Os dados como tal eram um arquivo. Visualmente, não conseguimos identificar o que havia de errado com esses dados.

Por que estávamos vendo erros nos logs do Oracle?

Então, se isso foi um defeito de driver, por que vimos o erro no oracle trace? Logicamente, os erros de driver devem ser confinados apenas aos logs do aplicativo. A razão foi que, quando a violação do protocolo ocorreu, a conexão foi corrompida. Esta conexão foi retornada ao pool de conexões. Qualquer usuário ou trabalho quando usar essa conexão não funcionará e apresentará erros. É por isso que isso acontecerá em lugares aleatórios, com usuários aleatórios

Solução

Uma correção de curto prazo foi alterar essa propriedade no pool de conexões. Estamos usando o pool de conexão DBCP.

Alterado deds.setTestOnBorrow(false);tods.setTestOnBorrow(true);

Agora, quando o pool retorna uma conexão corrompida ao pool, antes que o aplicativo empreste essa conexão, ele testará a validade. Se a conexão for inutilizável, o pool será descartado e o aplicativo obterá uma conexão nova/válida.

Se você habilitar os logs do pool de conexões, deverá ver a exceção que normalmente é engolida.

Atualização de driver

A atualização para OJDBC 12.1.0.2 do OJDBC 12.1.0.1 resolveu o problema, mesmo para as linhas problemáticas.

Alguns outros links para referência

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