sql >> Database >  >> RDS >> Oracle

SQLException:Protocolschending. Probleem met Oracle JDBC-stuurprogramma

Voor toekomstige googlers die naar deze pagina moeten, hier is het probleem dat we hadden. De uitzondering voor protocolschending werd vastgelegd in toepassingslogboeken en Oracle-tracering.

Oracle trace

Dit is een fout van orakel-traceerbestanden

--- PROTOCOLSCHENDING GEDETECTEERD ---

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

Van toepassingslogboeken

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

Symptoom

Deze uitzondering kwam af en toe voor. De stacktracering bevatte verschillende sql, wat erg verwarrend was. Het uitvoeren van de sql met sql plus werkte prima.

Hoofdoorzaak

De uitzondering is opgetreden toen het orakelstuurprogramma probeerde CLOB-gegevens te exporteren. Dit gebeurde met slechts enkele records, niet allemaal. De gegevens waren als zodanig een bestand. Visueel konden we niet zien wat er mis was met die gegevens.

Waarom zagen we fouten in orakellogboeken?

Dus als dit een driverfout was, waarom zagen we dan de fout in Oracle Trace? Logischerwijs zouden de stuurprogrammafouten alleen beperkt moeten blijven tot toepassingslogboeken. De reden was dat toen protocolschending plaatsvond, de verbinding beschadigd raakte. Deze verbinding is teruggestuurd naar de verbindingspool. Elke gebruiker of taak die die verbinding gebruikt, zou niet werken en zou een fout ervaren. Daarom zal het op willekeurige plaatsen gebeuren, met willekeurige gebruikers

Oplossing

Een kortetermijnoplossing was om deze eigenschap in de verbindingspool te wijzigen. We gebruiken een DBCP-verbindingspool.

Gewijzigd vands.setTestOnBorrow(false);tods.setTestOnBorrow(true);

Wanneer de pool nu een beschadigde verbinding naar de pool retourneert, voordat de app deze verbinding leent, zou deze op geldigheid testen. Als de verbinding onbruikbaar is, wordt de pool weggegooid en krijgt de app een nieuwe/geldige verbinding.

Als u verbindingspoollogboeken inschakelt, zou u de uitzondering moeten zien die normaal gesproken wordt ingeslikt.

Driver-upgrade

Upgrade naar OJDBC 12.1.0.2 van OJDBC 12.1.0.1 loste het probleem op, zelfs voor de problematische rijen.

Enkele andere links ter referentie

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



  1. Een CSV-bestand importeren in een SQLite-tabel

  2. Trage zoekopdracht bij gebruik van ORDER BY

  3. SQL INTERSECT

  4. Kan ik meerdere cursors op één verbinding gebruiken met pyodbc en MS SQL Server?