web-dev-qa-db-fra.com

SQLException: violation de protocole dans Oracle

J'obtiens la "violation de protocole". J'ai une application fonctionnant sur RedHat Linux. La base de données et l'application co-résident sur la machine.

Version Oracle utilisée: Oracle 11g R2 (11.2.0.3.0)
Pilote JDBC utilisé: 12.1.0.1
Java utilisé: jdk1.7.0.65 32 bits

J'ai rencontré de nombreux forums où cette erreur a été signalée comme un problème de pilote, mais dans tous ces forums, la version Oracle utilisée était supérieure et la version du pilote était plus ancienne et le changement de pilote a résolu le problème.Mais dans mon cas, la version Oracle est inférieur mais la version du pilote est plus élevée. Dans ce cas, la version supérieure du pilote pourrait-elle être un problème?

En outre, cette violation de protocole peut également survenir lorsque le nombre maximal de connexions sur la base de données est atteint?

Message d'erreur:

Java.sql.SQLException: violation de protocole: [72] sur Oracle.jdbc.driver.T4CTTIfun.receive (T4CTTIfun.Java:464) sur Oracle.jdbc.driver.T4CTTIfun.doRPC (T4CTTIfun.Java:192) sur Oracle.jdbc .driver.T4C8Oall.doOALL (T4C8Oall.Java:531) chez Oracle.jdbc.driver.T4CPreparedStatement.doOall8 (T4CPreparedStatement.Java:207) chez Oracle.jdbc.driver.T4CPreparedStatement.executeForParateCorseTorParseCorseTorPeg jdbc.driver.OracleStatement.executeMaybeDescribe (OracleStatement.Java:1167) sur Oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout (OracleStatement.Java:1289) sur Oracle.jdbc.driver.OraclePreparedStatement.executeInexParateStatement.executeInstructure: Oracle .jdbc.driver.OraclePreparedStatement.executeQuery (OraclePreparedStatement.Java:3628) sur Oracle.jdbc.driver.OraclePreparedStatementWrapper.executeQuery (OraclePreparedStatementWrapper.Java:1493)

8
Saurav

Une telle erreur indique un bogue dans le pilote léger JDBC qui n'est pas en mesure de comprendre ce que le serveur renvoie sur le câble (socket).

Vous pouvez toujours essayer d'utiliser le tout dernier pilote léger JDBC en espérant que le bogue sera résolu. À ce jour, la dernière version est la 12.1.0.2.

Si cela ne vous aide pas, vous devrez contacter le support Oracle. La première chose qui vous sera demandée est de fournir la trace sqlnet de la connexion où cette erreur s'est produite. Cela aidera les ingénieurs d'Oracle à comprendre ce qui se passait sur le réseau au moment de l'échec.

Pour activer le suivi sqlnet, modifiez votre fichier sqlnet.ora sur le serveur et ajoutez

TRACE_LEVEL_SERVER = 16

qui ajoutera un fichier de trace pour chaque connexion dans votre directeur de trace (sur le serveur). Ne faites pas cela sur un système de production car cela ralentira considérablement le système et générera une énorme quantité de traces.

Bonne chance.

6
Jean de Lavarene

Augmentez l'espace du tas!

J'ai eu cette erreur exacte apparaissant au hasard.

L'application manquait de mémoire et l'erreur OutOfMemory a été perdue en raison de la logique dans le code qui a entraîné la levée d'une exception non liée.

L'une des raisons pour lesquelles les applications ne doivent pas gérer les objets jetables et les erreurs.

5
Tian Na

Dans mon cas, l'utilisation de getGeneratedKeys () de PreparedStatement pour obtenir la valeur de séquence actuelle a provoqué les exceptions de violation de protocole. Le remplacer par obtenir la valeur actuelle de séquence à partir de la séquence, comme suit:

String curSeqValQuery = "SELECT seq_name.CURRVAL FROM DUAL";
...
statement = con.prepareStatement(curSeqValQuery);
resultSet = (OracleResultSet) statement.executeQuery();
...

résolu le problème.

1
AVA

Cela indique généralement un trafic TCP/IP corrompu. Cela peut être dû au trafic injecté ou à la perte de paquets. Faites un ifconfig pour voir si l'une de vos interfaces réseau est affectée par une quantité inhabituelle élevée de paquets perdus. Pour éviter les problèmes, comme vous indiquez que la base de données et le programme Java s'exécutent sur la même machine, essayez d'utiliser l'interface de bouclage 127.0.0.1 (localhost), plutôt que son IP externe pour se connecter à la base de données, ou l'inverse juste pour un test.

Je n'ai pas étudié cela plus avant, mais je suppose que cela pourrait également se produire lorsque la version du pilote et de la base de données sont trop éloignées. Obtenir le pilote pour qu'il corresponde à Oracle installé ne devrait pas être trop difficile.

0
YoYo

Il se peut simplement que la connexion soit infectée ou invalide. Si votre connexion JDBC provient d'un pool de connexions, assurez-vous toujours de tester la connexion sur réserve.

0

Le problème résolu dans ojdbc7.jar - version 12.1.0.2 (version que vous pouvez archiver dans le fichier META-INF du pot)

0
Santhosh Aella