web-dev-qa-db-fra.com

Comment aborder une erreur "Vous obtenez moins d'un appel de lecture" lors de la connexion à une instance Oracle Amazon RDS

J'exécute Oracle 11GR2 sur une instance Amazon RDS. Parfois, je reçois un IO Error: Got minus one from a read call lorsque j'appelle DriverManager.getConnection(getUrl()) et je ne sais pas pourquoi. Les autres applications fonctionnent correctement.

Pour compliquer encore les choses, l'erreur se corrigera d'elle-même à l'occasion (à la prochaine itération du programme).

Comment dois-je aborder une erreur "Got less moins one from read call"?

Trace complète de la pile:

Java.sql.SQLRecoverableException: IO Error: Got minus one from a read call
    at Oracle.jdbc.driver.T4CConnection.logon(T4CConnection.Java:489)
    at Oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.Java:553)
    at Oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.Java:254)
    at Oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.Java:32)
    at Oracle.jdbc.driver.OracleDriver.connect(OracleDriver.Java:528)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:579)
    at Java.sql.DriverManager.getConnection(DriverManager.Java:243)
    at com.cwd.facile.db.Database.<init>(Database.Java:44)
    at com.cwd.facile.ns.NetSuiteRequestBased.<init>(NetSuiteRequestBased.Java:29)
    at com.cwd.facile.ns.CommonOperations.isInventoryItem(CommonOperations.Java:205)
    at com.cwd.facile.ns.CommonOperations.findItemIdByName(CommonOperations.Java:188)
    at com.cwd.facile.ns.CommonOperations.createSalesOrder(CommonOperations.Java:970)
    at com.cwd.facile.Main.main(Main.Java:47)
Caused by: Oracle.net.ns.NetException: Got minus one from a read call
    at Oracle.net.ns.Packet.receive(Packet.Java:311)
    at Oracle.net.ns.NSProtocol.connect(NSProtocol.Java:300)
    at Oracle.jdbc.driver.T4CConnection.connect(T4CConnection.Java:1140)
    at Oracle.jdbc.driver.T4CConnection.logon(T4CConnection.Java:340)
    ... 12 more

Ligne de base de données.Java 44: setConn(DriverManager.getConnection(getUrl()));

Autre info:

  • Je pensais que c’était une mauvaise URL JDBC, mais cela fonctionne, parfois pendant des jours avant d’échouer.
  • Amazon RDS est une instance gérée et les modifications de configuration risquent de ne pas être possibles
  • J'utilise ojdbc6.jar pour la connectivité
59
Robert H

La cause immédiate du problème est que le pilote JDBC a tenté de lire à partir d'un socket réseau qui a été fermé par "l'autre extrémité".

Cela pourrait être dû à quelques choses:

  • Si le serveur distant a été configuré (par exemple, dans le fichier "SQLNET.ora") pour ne pas accepter les connexions de votre IP.

  • Si l'URL JDBC est incorrecte, vous pouvez tenter de vous connecter à quelque chose qui n'est pas une base de données.

  • S'il y a trop de connexions ouvertes au service de base de données, le service peut refuser de nouvelles connexions.

Compte tenu des symptômes, je pense que le scénario "trop ​​de connexions" est le plus probable. Cela suggère que votre application fuit les connexions; c'est-à-dire créer des connexions et ne pas les fermer (toujours).

81
Stephen C

Nous avons fait face au même problème et résolu. Vous trouverez ci-dessous la raison et la solution.

Problème

Lorsque nous créons une connexion à une base de données via un mécanisme de pool de connexions, le serveur d'applications (dans notre cas, il s'agit de JBOSS) crée la connexion comme indiqué dans le paramètre min-connection. Si vous avez 10 applications en cours d'exécution et que chacune a une connexion minimale de 10, 100 sessions au total seront créées dans la base de données. De plus, dans chaque base de données, il existe un paramètre max-session, si votre connexion totale franchit cette frontière, vous obtiendrez "Vous obtenez moins d'un appel de lecture" FYI: Utilisez la requête ci-dessous pour afficher votre session totale.

SELECT username, count(username) FROM v$session 
WHERE username IS NOT NULL group by username

Solution: avec l'aide de notre administrateur de base de données, nous avons augmenté ce nombre maximal de sessions afin que toutes nos applications, min-connection, puissent en prendre en charge.

11
Arnab Sarkar

Je voudrais augmenter la réponse de Stephen C, mon cas était sur le premier point. Donc, puisque nous avons DHCP pour attribuer des adresses IP dans l'entreprise, DHCP a changé l'adresse de ma machine sans bien sûr me demander ni Oracle ni moi. Donc, à l'improviste, Oracle a refusé de faire quoi que ce soit et a donné l'exception moins redoutée. Donc, si vous voulez contourner ce problème une fois pour toutes et que le fichier TCP.INVITED_NODES du fichier SQLNET.ora n’accepte pas les caractères génériques comme indiqué ici , vous pouvez ajouter le nom d’hôte de votre ordinateur à la place de l’adresse IP.

1
Stelios Adamantidis