sql >> Databasteknik >  >> RDS >> Oracle

SQLException:Protokollbrott. Oracle JDBC-drivrutinsproblem

För framtida googlare som måste besöka den här sidan, här är problemet vi hade. Undantaget för protokollöverträdelse loggades på programloggar och Oracle-spårning.

Oracle-spårning

Detta är ett fel från oracle trace-filer

--- PROTOKOLLBROTT UPPTÄCKTS ---

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

Från applikationsloggar

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

Symtom

Detta undantag inträffade då och då. Stackspåret hade olika sql i sig vilket var väldigt förvirrande. Att köra sql med sql plus fungerade bra.

Rootorsak

Undantaget kastades när oracle-drivrutinen försökte exportera en CLOB-data. Detta hände med bara några få skivor, inte alla. Uppgifterna som sådana var en fil. Visuellt kunde vi inte se vad som var fel med den informationen.

Varför såg vi fel i orakelloggar?

Så om detta var ett drivrutinsfel, varför såg vi felet i Oracle Trace? Logiskt sett bör drivrutinsfelen endast begränsas till applikationsloggar. Anledningen var att när protokollöverträdelser inträffade, blev anslutningen skadad. Denna anslutning returnerades till anslutningspoolen. Alla användare eller jobb som kommer att använda den anslutningen skulle inte fungera och skulle uppleva fel. Det är därför det kommer att hända på slumpmässiga platser, med slumpmässiga användare

Lösning

En kortsiktig fix var att ändra den här egenskapen i anslutningspoolen. Vi använder DBCP-anslutningspool.

Ändrad fromds.setTestOnBorrow(false);tods.setTestOnBorrow(true);

Nu när poolen returnerar en skadad anslutning till poolen, innan appen lånar den här anslutningen, testar den för giltighet. Om anslutningen är oanvändbar kommer poolen att förkastas och sedan får appen en ny/giltig anslutning.

Om du aktiverar loggar för anslutningspool bör du se undantaget som normalt sväljs.

Uppgradering av drivrutiner

Uppgradering till OJDBC 12.1.0.2 från OJDBC 12.1.0.1 löste problemet, även för de problematiska raderna.

Några andra länkar för referens

https://confluence.atlassian.com/display/CONFKB/java.sql.SQLException%3A+Protocol+violation+caught+while+accessing+en+page+and+Oracle+DB+används



  1. Lagring av SqlServers raiserror-meddelande i C#

  2. Objektet i klassen DateTime kunde inte konverteras till sträng

  3. Oracle SQL:Kolumn inte tillåten

  4. Varför kan jag inte använda kolumnalias i nästa SELECT-uttryck?