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:
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).
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.
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.