我在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
Run Code Online (Sandbox Code Playgroud)
Database.java第44行: setConn(DriverManager.getConnection(getUrl()));
其他信息:
Ste*_*n C 83
问题的直接原因是JDBC驱动程序试图从已被"另一端"关闭的网络套接字读取.
这可能是由于以下几点:
如果已配置远程服务器(例如,在"SQLNET.ora"文件中),则不接受来自IP的连接.
如果JDBC URL不正确,您可能正在尝试连接到非数据库的东西.
如果与数据库服务的打开连接太多,则可能会拒绝新连接.
鉴于这些症状,我认为"太多连接"的情况是最有可能的.这表明您的应用程序正在泄漏连接; 即创建连接然后失败(总是)关闭它们.
小智 11
我们面临同样的问题并得到修复.以下是原因和解决方案.
问题
当我们通过连接池机制创建数据库连接时,应用服务器(在我们的例子中是JBOSS)创建连接,如min-connection参数中所述.如果您有10个应用程序正在运行,并且每个应用程序的最小连接数为10,那么将在数据库中创建总共100个会话.同样在每个数据库中都有一个max-session参数,如果你的总连接越过那个边界,你会得到"从读取呼叫中减去一个"FYI:使用下面的查询来查看你的总会话
SELECT username, count(username) FROM v$session
WHERE username IS NOT NULL group by username
Run Code Online (Sandbox Code Playgroud)
解决方案:在我们的DBA的帮助下,我们增加了max-session,以便我们的所有应用程序最小连接都可以容纳.
小智 5
尽管我已将端口发布到主机选项“-p 1521:1521”,但我还是通过在 docker 中使用 oracle 数据库收到此错误消息。我使用的是使用 ip 地址 127.0.0.1 的 jdbc url,我将其更改为主机真实 ip 地址,然后一切正常。
归档时间: |
|
查看次数: |
202014 次 |
最近记录: |