Oracle
 sql >> Database >  >> RDS >> Oracle

SQLException:violazione del protocollo. Problema con il driver Oracle JDBC

Per i futuri googler che devono accedere a questa pagina, ecco il problema che abbiamo riscontrato. L'eccezione di violazione del protocollo veniva registrata nei registri dell'applicazione e nella traccia Oracle.

Traccia di Oracle

Questo è un errore dei file di traccia di Oracle

--- RILEVATA VIOLAZIONE DEL PROTOCOLLO ---

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

Dai registri delle applicazioni

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

Sintomo

Questa eccezione si verificava occasionalmente. La traccia dello stack aveva un sql diverso, il che era molto confuso. L'esecuzione di sql con sql plus ha funzionato bene.

Causa principale

L'eccezione è stata generata quando il driver Oracle stava tentando di esportare dati CLOB. Questo stava accadendo solo con pochi record, non tutti. I dati in quanto tali erano un file. Visivamente non siamo riusciti a capire cosa c'era di sbagliato in quei dati.

Perché vedevamo errori nei log di Oracle?

Quindi, se si trattava di un difetto del driver, perché abbiamo visto l'errore in Oracle trace? Logicamente gli errori del driver dovrebbero essere limitati solo ai registri dell'applicazione. I motivi erano che quando si è verificata una violazione del protocollo, la connessione è stata danneggiata. Questa connessione è stata restituita al pool di connessioni. Qualsiasi utente o lavoro quando utilizzerà quella connessione non funzionerebbe e riscontrerebbe errori. Ecco perché accadrà in luoghi casuali, con utenti casuali

Soluzione

Una soluzione a breve termine consisteva nel modificare questa proprietà nel pool di connessioni. Stiamo utilizzando il pool di connessioni DBCP.

Modificato fromds.setTestOnBorrow(false);tods.setTestOnBorrow(true);

Ora, quando il pool restituisce una connessione danneggiata al pool, prima che l'app prenda in prestito questa connessione, ne verificherebbe la validità. Se la connessione è inutilizzabile, il pool viene eliminato e l'app ottiene una connessione nuova/valida.

Se abiliti i log del pool di connessioni, dovresti vedere l'eccezione che normalmente viene inghiottita.

Aggiornamento conducente

L'aggiornamento a OJDBC 12.1.0.2 da OJDBC 12.1.0.1 ha risolto il problema, anche per le righe problematiche.

Alcuni altri link di riferimento

https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violazione+catturata+durante+l'accesso+a+una+pagina+e+viene+usato+Oracle+DB