How to approach a "Got minus one from a read call" error when connecting to an Amazon RDS Oracle instance
JavaOracleJava 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]$