连接到 Amazon RDS Oracle 实例时如何处理“从读取调用中得到减一”错误

新手上路,请多包涵

我在 Amazon RDS 实例上运行 Oracle 11GR2。有时我在调用 IO Error: Got minus one from a read call 时会收到 DriverManager.getConnection(getUrl()) 我不知道为什么。其他应用程序正常工作。

为了进一步混淆事情,错误有时会自行纠正(在程序的下一次迭代之后)。

我应该如何处理“从读取调用中得到减一”错误?

完整的堆栈跟踪:

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

其他信息:

  • 我认为这是一个错误的 JDBC url,但它确实有效,有时会持续数天,然后才会失败。
  • Amazon RDS 是托管实例,可能无法更改配置
  • 我正在使用 ojdbc6.jar 进行连接

原文由 Robert H 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

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

这可能是由于以下几点:

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

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

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

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

原文由 Stephen C 发布,翻译遵循 CC BY-SA 3.0 许可协议

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

问题

当使用连接池机制时,应用服务器(在我们的例子中是JBOSS)根据 min-connection 参数创建连接。如果您有 10 个应用程序正在运行,并且每个应用程序的 min-connection 为 10,那么将在数据库中创建总共 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 可以容纳。

原文由 Arnab Sarkar 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题