连接到Amazon RDS Oracle实例时,如何处理“从读取调用中减去一个”错误
我正在Amazon RDS实例上运行Oracle 11GR2。 偶尔我会得到一个IO Error: Got minus one from a read call
调用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
Database.java第44行: setConn(DriverManager.getConnection(getUrl()));
其他信息:
- 我认为这是一个错误的JDBCurl,但它确实有效,有时在失败之前连续几天。
- Amazon RDS是受pipe实例,configuration更改可能无法进行
- 我正在使用ojdbc6.jar进行连接
问题的直接原因是JDBC驱动程序试图从“另一端”closures的networking套接字读取数据。
这可能是由于几件事情:
-
如果已经configuration远程服务器(例如在“SQLNET.ora”文件中)不接受来自IP的连接。
-
如果JDBC url不正确,则可能试图连接到不是数据库的东西。
-
如果数据库服务的打开连接太多,可能会拒绝新的连接。
鉴于症状,我认为“太多连接”的情况是最有可能的。 这表明你的应用程序正在泄漏连接。 即创build连接,然后closures它们。
我们面临同样的问题,并修复。 以下是原因和解决scheme。
问题
当我们通过连接池机制创build数据库连接时,应用服务器(在我们的例子中是JBOSS)创build连接,如min-connection参数中所述。 如果您有10个应用程序正在运行,并且每个应用程序的最小连接数为10,那么将在数据库中创build总计100个会话。 同样在每个数据库中都有一个最大会话参数,如果你的总连接超过边界,你会得到“从读通话减去一个”FYI:使用下面的查询来查看你的总会话
SELECT username, count(username) FROM v$session WHERE username IS NOT NULL group by username
解决scheme:在DBA的帮助下,我们增加了最大会话,以便我们所有的应用程序最小连接都可以容纳。
我想补充斯蒂芬C的回答,我的情况是在第一个点。 所以,既然我们有DHCP来分配公司的IP地址,DHCP改变了我的机器的地址,当然也不要求我和Oracle。 所以,出于蓝色的神谕拒绝做任何事情,并给了一个可怕的例外。 所以,如果你想一劳永逸地解决这个问题,并且由于SQLNET.ora文件的TCP.INVITED_NODES不接受通配符,所以你可以添加你的机器的主机名而不是IP地址。