Java 如何接近a";从读取调用中得到负1“;连接到Amazon RDS Oracle实例时出错

Java 如何接近a";从读取调用中得到负1“;连接到Amazon RDS Oracle实例时出错,java,oracle,Java,Oracle,我正在Amazon RDS实例上运行Oracle 11GR2。偶尔我会遇到一个IO错误:在调用DriverManager.getConnection(getUrl())时,读取调用得到了负1,我不确定原因。其他应用程序工作正常 为了进一步混淆,错误有时会自行纠正(在程序的下一次迭代之后) 如何处理“从读取调用中获取负1”错误? 完整堆栈跟踪: java.sql.SQLRecoverableException: IO Error: Got minus one from a read call

我正在Amazon RDS实例上运行Oracle 11GR2。偶尔我会遇到一个
IO错误:在调用
DriverManager.getConnection(getUrl())
时,读取调用得到了负1,我不确定原因。其他应用程序工作正常

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

如何处理“从读取调用中获取负1”错误?

完整堆栈跟踪:

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.sql.SQLRecoverableException:IO错误:从读取调用中得到负1
位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:489)
位于oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:553)
位于oracle.jdbc.driver.T4CConnection(T4CConnection.java:254)
位于oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
位于oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528)
位于java.sql.DriverManager.getConnection(DriverManager.java:579)
位于java.sql.DriverManager.getConnection(DriverManager.java:243)
位于com.cwd.facile.db.Database.(Database.java:44)
位于com.cwd.facile.ns.NetSuiteRequestBased。(NetSuiteRequestBased.java:29)
位于com.cwd.facile.ns.CommonOperations.isInventoryItem(CommonOperations.java:205)
位于com.cwd.facile.ns.CommonOperations.FindItemByName(CommonOperations.java:188)
位于com.cwd.facile.ns.CommonOperations.createSalesOrder(CommonOperations.java:970)
位于com.cwd.facile.Main.Main(Main.java:47)
原因:oracle.net.ns.NetException:从读取调用中得到负1
位于oracle.net.ns.Packet.receive(Packet.java:311)
位于oracle.net.ns.NSProtocol.connect(NSProtocol.java:300)
位于oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1140)
位于oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:340)
... 还有12个
Database.java第44行:
setConn(DriverManager.getConnection(getUrl())

其他资料:

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

问题的直接原因是JDBC驱动程序试图从被“另一端”关闭的网络套接字读取数据

这可能是由于以下几点:

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

  • 如果JDBCURL不正确,则可能是试图连接到非数据库的对象

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


鉴于这些症状,我认为“连接太多”的情况最有可能出现。这表明您的应用程序正在泄漏连接;i、 e.创建连接,但未能(始终)关闭连接

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

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

问题

当使用连接池机制时,应用程序服务器(在我们的例子中是JBOSS)根据
minconnection
参数创建连接。如果您有10个正在运行的应用程序,并且每个应用程序的
minconnection
为10,那么数据库中将总共创建100个会话。此外,在每个数据库中,都有一个
max session
参数,如果您的连接总数跨越该边界,那么您将从读取调用中获得
get减一

仅供参考:使用以下查询查看您的会话总数:

SELECT username, count(username) FROM v$session 
WHERE username IS NOT NULL group by username

解决方案:在DBA的帮助下,我们增加了
max session
参数,以便我们的所有应用程序
min connection
都可以容纳。

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

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

如果您超过了MAXPROCESS或MAXSESSION,您确实会遇到与该情况相关的错误,连接不会简单地关闭。这就是为什么我们为服务器提供静态IP。或者,如果您想使用DHCP,您可以通过DHCP保留为MAC地址分配一个特定的IP。@Sun我的电脑是服务器。是的,如果您无法控制IP设置。。。你能做的不多,但希望主机名能跟上IP地址的变化。关闭任何干预网络连接的代理或vpn软件也能解决问题。是的。客户端或AWS实例的电源循环也是如此。但这些都是创可贴。他们没有解决潜在的问题。考虑这个问题:可能你使用的Oracle驱动程序被弃用。