2011-01-13 25 views
8

sto ottenendo il seguente excpetion:SQLException: violazione del protocollo. Oracle JDBC problema di driver

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) 

Il sistema Oracle è in esecuzione su Solaris 10.2.0.3.0 5.10. Il driver jdbc è in esecuzione su JDK 1.6.0_21 (se è importato, java è in esecuzione anche su una macchina Solaris 5.10). Ho provato diversi driver per Oracle oracle, incluso l'ultimo e quello che sembra corrispondere esattamente alla versione di Oracle.

La query che sto utilizzando è abbastanza semplice: "seleziona * da qualche_table order da key1, key2, key3" Quindi iterando attraverso il set di risultati e scrivendo su un file. La tabella ha circa 12 milioni di righe, quindi mi aspetto che il processo funzioni a lungo, ma sembra morire entro 5-15 minuti. Ogni volta che lo eseguo, esplode su una riga diversa, quindi non penso che il problema sia con i dati.

Ho trovato il registro degli avvisi di Oracle, ma non ho potuto dire che tutto ciò che è contenuto fosse correlato al mio processo. Tuttavia, non sono un esperto di oracoli e forse c'è un oracolo che devo guardare. Stranamente, sto eseguendo circa cinque di questi tipi di query (un paio sono un po 'più complicate) su connessioni diverse e solo due più semplici hanno mai riscontrato questo problema.

Qualsiasi aiuto o idea su cosa guardare per restringere il problema sarebbe apprezzato.

+0

Forse siete a corto di memoria sul server di DB? Stai chiudendo correttamente le risorse in Java? Sta succedendo nella prima query eseguita nella tua serie o in una delle ultime? – Riggy

risposta

6

Apparentemente l'aggiunta di -d64 alla riga di comando java risolve questo problema. Sembra un problema di Solaris a 64 bit.

+2

Per me, l'aggiornamento del mio driver ojdbc ha risolto questo problema. Sono saltato su 11.2.0.2.0 e tutto andava bene. – Muel

5

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

Oracle traccia

Questo è l'errore dal file di traccia Oracle

--- PROTOCOLLO VIOLAZIONE RILEVATA ---

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

da tronchi di applicazione

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 diversi sql in esso che erano molto confusi. L'esecuzione di sql con sql plus ha funzionato correttamente.

Root Cause

L'eccezione è stata generata quando driver Oracle stava cercando di esportare un dato CLOB. Questo stava accadendo con solo 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é stavamo vedendo errori nei registri di Oracle?

Quindi, se questo era un difetto del driver, perché abbiamo visto l'errore nella traccia di Oracle? Logicamente gli errori del driver dovrebbero essere limitati ai log delle applicazioni. La ragione era che quando si verificava una violazione del protocollo, la connessione si corrompeva.Questa connessione è stata restituita al pool di connessioni. Qualsiasi utente o lavoro che utilizzi quella connessione non funzionerebbe e verrebbe riscontrato un errore. Ecco perché avverrà in luoghi casuali, con gli utenti casuali

Solution

Una soluzione a breve termine è stato quello di cambiare questa proprietà nel pool di connessioni. Stiamo usando il pool di connessioni DBCP.

Modificato da ds.setTestOnBorrow (false); a ds.setTestOnBorrow (true);

Ora, quando il pool restituisce una connessione danneggiata al pool, prima che l'app prende in prestito questa connessione, testerebbe la validità. Se la connessione è inutilizzabile, il pool scarterebbe e quindi l'app otterrà una nuova/valida connessione.

Se si abilitano i log del pool di connessione, si dovrebbe vedere l'eccezione che normalmente viene ingerita.

driver aggiornamento

aggiornamento a OJDBC 12.1.0.2 da OJDBC 12.1.0.1 risolto il problema, anche per le righe problematici.

Alcuni altri link di riferimento

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

Problemi correlati