How to approach a "Got minus one from a read call" error when connecting to an Amazon RDS Oracle instance

JavaOracle

Java Problem Overview


I'm running Oracle 11GR2 on an Amazon RDS instance. occasionally I get an IO Error: Got minus one from a read call when making a call to DriverManager.getConnection(getUrl()) and I'm not sure why. Other applications work correctly.

To further confuse things, the error will correct itself on occasion (following next iteration of the program).

How should I approach a "Got minus one from a read call" error?

Full stack trace:

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 line 44: setConn(DriverManager.getConnection(getUrl()));

Other info:

  • I thought it was a bad JDBC url, but it does work, sometimes for days on end before failing.
  • Amazon RDS is a managed instance and configuration changes may not be possible
  • I am using ojdbc6.jar for connectivity

Java Solutions


Solution 1 - Java

The immediate cause of the problem is that the JDBC driver has attempted to read from a network Socket that has been closed by "the other end".

This could be due to a few things:

  • If the remote server has been configured (e.g. in the "SQLNET.ora" file) to not accept connections from your IP.

  • If the JDBC url is incorrect, you could be attempting to connect to something that isn't a database.

  • If there are too many open connections to the database service, it could refuse new connections.

Given the symptoms, I think the "too many connections" scenario is the most likely. That suggests that your application is leaking connections; i.e. creating connections and then failing to (always) close them.

Solution 2 - Java

We faced the same issue and fixed it. Below is the reason and solution.

Problem

When the connection pool mechanism is used, the application server (in our case, it is JBOSS) creates connections according to the min-connection parameter. If you have 10 applications running, and each has a min-connection of 10, then a total of 100 sessions will be created in the database. Also, in every database, there is a max-session parameter, if your total number of connections crosses that border, then you will get Got minus one from a read call.

FYI: Use the query below to see your total number of sessions:

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

Solution: With the help of our DBA, we increased that max-session parameter, so that all our application min-connection can accommodate.

Solution 3 - Java

I got this error message from using an oracle database in a docker despite the fact i had publish port to host option "-p 1521:1521". I was using jdbc url that was using ip address 127.0.0.1, i changed it to the host machine real ip address and everything worked then.

Solution 4 - Java

I would like to augment to Stephen C's answer, my case was on the first dot. So since we have DHCP to allocate IP addresses in the company, DHCP changed my machine's address without of course asking neither me nor Oracle. So out of the blue oracle refused to do anything and gave the minus one dreaded exception. So if you want to workaround this once and for ever, and since TCP.INVITED_NODES of SQLNET.ora file does not accept wildcards as stated here, you can add you machine's hostname instead of the IP address.

Solution 5 - Java

in my case, I got the same exception because the user that I configured in the app did not existed in the DB, creating the user and granting needed permissions solved the problem.

Solution 6 - Java

Cause

oracle binary permission issue ($ORACLE_HOME/bin/oracle)

[tst19c@exa033dbadm01 bin]$ $ORACLE_HOME/bin

[tst19c@exa033dbadm01 bin]$ ls -ltr oracle

-rwxr-s--x 1 tst19c asmadmin 446528768 May 3 14:28 oracle

Action Taken

[tst19c@exa033dbadm01 bin]$ chmod 6751 oracle

[tst19c@exa033dbadm01 bin]$ ls -ltr oracle

Now

-rwsr-s--x 1 tst19c asmadmin 446528768 May 3 14:28 oracle

[tst19c@exa033dbadm01 bin]$

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionRobert HView Question on Stackoverflow
Solution 1 - JavaStephen CView Answer on Stackoverflow
Solution 2 - JavaArnab SarkarView Answer on Stackoverflow
Solution 3 - JavaPierre NakashianView Answer on Stackoverflow
Solution 4 - JavaStelios AdamantidisView Answer on Stackoverflow
Solution 5 - JavaRahul GuptaView Answer on Stackoverflow
Solution 6 - JavaAtul PatelView Answer on Stackoverflow