![](/img/trans.png)
[英]Found issue in java application connecting with oracle database,SQLException: Io exception: Got minus one from a read call ,how I can solve it?
[英]How to approach a "Got minus one from a read call" error when connecting to an Amazon RDS Oracle instance
我在 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 驱动程序试图从已被“另一端”关闭的网络 Socket 中读取数据。
这可能是由于以下几点:
如果远程服务器已配置(例如在“SQLNET.ora”文件中)不接受来自您 IP 的连接。
如果 JDBC url 不正确,您可能正在尝试连接到不是数据库的东西。
如果与数据库服务的打开连接过多,它可能会拒绝新连接。
鉴于这些症状,我认为“连接过多”的情况最有可能。 这表明您的应用程序正在泄漏连接; 即创建连接,然后未能(总是)关闭它们。
我们遇到了同样的问题并修复了它。 下面是原因和解决方法。
问题
当使用连接池机制时,应用服务器(在我们的例子中是 JBOSS)根据min-connection
参数创建连接。 如果您有 10 个应用程序在运行,并且每个应用程序的min-connection
为 10,那么将在数据库中创建总共 100 个会话。 此外,在每个数据库中,都有一个max-session
参数,如果您的连接总数越过该边界,那么您将从Got minus one from a read call
得到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 地址,然后一切正常。
我想补充斯蒂芬 C 的回答,我的情况在第一个点上。 所以既然我们有DHCP来分配公司的IP地址,DHCP就改变了我机器的地址,当然既不问我也不问Oracle。 因此,出乎意料的 oracle 拒绝做任何事情,并给出了一个可怕的例外。 因此,如果您想一劳永逸地解决此问题,并且由于 SQLNET.ora 文件的 TCP.INVITED_NODES 不接受此处所述的通配符,您可以添加您机器的主机名而不是 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 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]$
当我尝试通过localhost
或127.0.0.1
在本地Docker 上运行Oracle 21c XE映像时,我遇到了类似的问题。
修复方法是登录容器并按以下方式修改sqlnet.ora
:
echo "DISABLE_OOB=ON" >> /opt/oracle/oradata/dbconfig/XE/sqlnet.ora
并重新启动容器。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.