Oracle
 sql >> Base de données >  >> RDS >> Oracle

SQLException :violation de protocole. Problème de pilote Oracle JDBC

Pour les futurs googleurs qui ont accès à cette page, voici le problème que nous avons rencontré. L'exception de violation de protocole était enregistrée dans les journaux d'application et la trace Oracle.

Suivi Oracle

Ceci est une erreur des fichiers de trace Oracle

--- VIOLATION DE PROTOCOLE DÉTECTÉE ---

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

À partir des journaux d'application

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

Symptôme

Cette exception se produisait occasionnellement. La trace de la pile contenait différents sql, ce qui était très déroutant. L'exécution de sql avec sql plus a bien fonctionné.

Cause fondamentale

L'exception a été levée lorsque le pilote oracle tentait d'exporter des données CLOB. Cela se produisait avec seulement quelques disques, pas tous. Les données en tant que telles étaient un fichier. Visuellement, nous ne pouvions pas déterminer ce qui n'allait pas avec ces données.

Pourquoi voyions-nous des erreurs dans les journaux Oracle ?

Donc, s'il s'agissait d'un défaut de pilote, pourquoi avons-nous vu l'erreur dans Oracle Trace ? Logiquement, les erreurs du pilote ne devraient être limitées qu'aux journaux d'application. La raison en était que, lorsque la violation du protocole se produisait, la connexion était corrompue. Cette connexion a été renvoyée au pool de connexions. Tout utilisateur ou travail qui utilisera cette connexion ne fonctionnera pas et rencontrera une erreur. C'est pourquoi cela se produira à des endroits aléatoires, avec des utilisateurs aléatoires

Solution

Une solution à court terme consistait à modifier cette propriété dans le pool de connexions. Nous utilisons le pool de connexion DBCP.

Changé de ds.setTestOnBorrow(false);tods.setTestOnBorrow(true);

Désormais, lorsque le pool renvoie une connexion corrompue au pool, avant que l'application n'emprunte cette connexion, elle teste la validité. Si la connexion est inutilisable, le pool est supprimé, puis l'application obtient une nouvelle connexion/valide.

Si vous activez les journaux du pool de connexions, vous devriez voir l'exception qui est normalement avalée.

Mise à niveau du pilote

La mise à niveau vers OJDBC 12.1.0.2 à partir d'OJDBC 12.1.0.1 a résolu le problème, même pour les lignes problématiques.

Quelques autres liens pour référence

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