Comment traiter une erreur "Got minus one from a read call" lors de la connexion à une instance Amazon RDS Oracle ?

J&#8217exécute Oracle 11GR2 sur une instance Amazon RDS. Il m&#8217arrive parfois d&#8217obtenir une " erreur d&#8217IO : Got minus one from a read calllors d'un appel àDriverManager.getConnection(getUrl())` et je ne sais pas pourquoi. Les autres applications fonctionnent correctement.

Pour rendre les choses encore plus confuses, l'erreur se corrige d'elle-même à l'occasion (après la prochaine itération du programme).

**Comment dois-je aborder l'erreur "Got minus one from a 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

Database.java ligne 44 : setConn(DriverManager.getConnection(getUrl()));

Autres informations:

  • Je pensais qu'il s'agissait d'une mauvaise url JDBC, mais cela fonctionne, parfois pendant des jours avant d'échouer.
  • Amazon RDS est une instance gérée et les changements de configuration ne sont pas toujours possibles.
  • J'utilise ojdbc6.jar pour la connectivité.
Solution

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 peut être dû à plusieurs choses:

  • Si le serveur distant a été configuré (par exemple dans le fichier "SQLNET.ora&quot ;) pour ne pas accepter de connexions depuis 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, celui-ci peut refuser les nouvelles connexions.

Au vu des symptômes, je pense que le scénario "trop de connexions" est le plus probable. Cela suggère que votre application laisse échapper des connexions, c'est-à-dire qu'elle crée des connexions et ne les ferme pas (toujours).

Commentaires (2)

Nous avons rencontré le même problème et l'avons résolu. Voici la raison et la solution.

Problème

Lorsque nous créons une connexion à la base de données par le biais du mécanisme de pool de connexion, le serveur d'applications (dans notre cas, il s'agit de JBOSS) crée la connexion mentionnée dans le paramètre de connexion minimale. Si vous avez 10 applications en cours d'exécution et que chacune a une connexion minimale de 10, un total de 100 sessions sera créé dans la base de données. De même, dans chaque base de données, il existe un paramètre de session maximale, si votre connexion totale dépasse cette limite, vous obtiendrez "Got minus one from a read call&quot ; FYI : Utilisez la requête ci-dessous pour voir le nombre total de sessions.

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

Solution : Avec l'aide de notre DBA, nous avons augmenté la session maximale afin que toutes les connexions minimales de nos applications puissent être acceptées.

Commentaires (1)

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

[1] : https://community.oracle.com/message/4568449

Commentaires (3)