如何在连接到 Amazon RDS Oracle 实例时处理"Got minus one from a read call"错误



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

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

我应该如何处理"从读取调用中获得减去一个"错误?

全栈跟踪:

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

数据库.java第 44 行:setConn(DriverManager.getConnection(getUrl()));

其他信息:

  • 我认为这是一个糟糕的 JDBC 网址,但它确实有效,有时在失败之前连续几天。
  • Amazon RDS 是托管实例,可能无法更改配置。
  • 我正在使用 ojdbc6.jar 进行连接

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

这可能是由于以下几点:

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

  • 如果 JDBC URL 不正确,则可能是在尝试连接到不是数据库的内容。

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

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

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

问题

当使用连接池机制时,应用程序服务器(在我们的例子中是 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都可以容纳。

尽管

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

当我

尝试通过 localhost127.0.0.1连接到它时,我在 Docker 本地运行 Oracle 21c XE 映像时遇到了类似的问题。

解决方法是登录到容器并按以下方式修改sqlnet.ora

echo "DISABLE_OOB=ON" >> /opt/oracle/oradata/dbconfig/XE/sqlnet.ora

,然后重新启动容器。

我想

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

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

原因

oracle二进制权限问题($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

采取的行动

[tst19c@exa033dbadm01 bin]$ chmod 6751 oracle

[tst19c@exa033dbadm01 bin]$ ls -ltr oracle

现在

-

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

[tst19c@exa033dbadm01 bin]$

相关内容

最新更新