78

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
4

6 回答 6

107

问题的直接原因是 JDBC 驱动程序试图从已被“另一端”关闭的网络 Socket 中读取。

这可能是由于以下几点:

  • 如果远程服务器已配置(例如在“SQLNET.ora”文件中)不接受来自您的 IP 的连接。

  • 如果 JDBC url 不正确,您可能正在尝试连接到不是数据库的东西。

  • 如果与数据库服务的打开连接太多,它可能会拒绝新连接。

鉴于这些症状,我认为“连接过多”的情况是最有可能的。这表明您的应用程序正在泄漏连接;即创建连接,然后未能(总是)关闭它们。

于 2013-10-29T14:51:38.987 回答
18

我们遇到了同样的问题并修复了它。下面是原因和解决方法。

问题

使用连接池机制时,应用服务器(在我们的例子中是JBOSS)根据min-connection参数创建连接。如果您有 10 个应用程序正在运行,并且每个应用程序有min-connection10 个,那么总共将在数据库中创建 100 个会话。此外,在每个数据库中,都有一个max-session参数,如果您的连接总数跨越该边界,那么您将获得Got minus one from a read call.

仅供参考:使用下面的查询查看您的会话总数:

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

解决方案:在我们的 DBA 的帮助下,我们增加了该max-session参数,以便我们所有的应用程序min-connection都可以容纳。

于 2014-06-19T21:39:21.053 回答
8

尽管我已经将端口发布到主机选项“-p 1521:1521”,但我在 docker 中使用 oracle 数据库时收到此错误消息。我使用的是使用 ip 地址 127.0.0.1 的 jdbc url,我将其更改为主机真实 ip 地址,然后一切正常。

于 2020-10-27T20:03:32.790 回答
2

我想补充斯蒂芬 C 的回答,我的情况是第一个点。因此,由于我们有 DHCP 来分配公司的 IP 地址,因此 DHCP 更改了我机器的地址,当然既不问我也不问 Oracle。所以出乎意料的神谕拒绝做任何事情,并给出了负一可怕的例外。因此,如果您想一劳永逸地解决此问题,并且由于 SQLNET.ora 文件的 TCP.INVITED_NODES 不接受此处所述的通配符,您可以添加机器的主机名而不是 IP 地址。

于 2014-02-11T08:39:30.893 回答
0

就我而言,我遇到了同样的异常,因为我在应用程序中配置的用户在数据库中不存在,创建用户并授予所需的权限解决了这个问题。

于 2020-11-26T07:01:27.857 回答
0

原因

oracle 二进制权限问题 ($ORACLE_HOME/bin/oracle)

[tst19c@exa033dbadm01 bin]$ $ORACLE_HOME/bin

[tst19c@exa033dbadm01 bin]$ ls -ltr oracle

-rwxr-s--x 1 tst19c asmadmin 446528768 5 月 3 日 14:28 oracle

采取的行动

[tst19c@exa033dbadm01 bin]$ chmod 6751 oracle

[tst19c@exa033dbadm01 bin]$ ls -ltr oracle

现在

-rwsr-s--x 1 tst19c asmadmin 446528768 5 月 3 日 14:28 oracle

[tst19c@exa033dbadm01 bin]$

于 2021-09-08T08:13:19.313 回答