java.sql.SQLException: Io 异常: Got minus one from a read call

 

博客分类:
 

Tomcat服务器下的应用连接Oracle时报错,出现以下异常:

java.sql.SQLException: Io 异常: Got minus one from a read call

查询数据库连接情况:

Java代码  收藏代码
  1. SQL> select username,count(username) from v$session where username is not null group by username;  
  2.   
  3. USERNAME                       COUNT(USERNAME)  
  4. ------------------------------ ---------------  
  5. SP2                                         33  
  6. YWTWEBDB                                    14  
  7. SYS                                          2  
  8. INFO                                         1  
  9. MF                                         658  
  10. UC                                         183  
  11.   
  12. 6 rows selected.  

 

Java代码  收藏代码
  1. SQL> select count(*) from v$session where status='ACTIVE';  
  2.   
  3.   COUNT(*)  
  4. ----------  
  5.        675  

 

原因不明:表现是数据库的连接数比较大,临时处理是重启数据库,重启后解决,但估计不是最终的解决方法。。重启后的连接情况:

Java代码  收藏代码
  1. 正常的时候的数据库连接数:  
  2. SQL> select username,count(username) from V$SESSION where username is not null group by username ;  
  3.   
  4. USERNAME                       COUNT(USERNAME)  
  5. ------------------------------ ---------------  
  6. SP2                                         11  
  7. YWTWEBDB                                     2  
  8. SYS                                          1  
  9. INFO                                         1  
  10. MF                                          79  
  11. MYJIN                                        1  
  12. UC                                          19  
  13.   
  14. 7 rows selected.  

 

以下收集了网上此问题的相关解决方法如下:

http://www.iteye.com/topic/1126453

http://blog.sina.com.cn/s/blog_529aacbd0100t22b.html

http://hi.baidu.com/xjieni/item/1afbff62dab025167cdecc21

摘录如下:

Java代码  收藏代码
  1. 今日无意中用java连接oracle时,竟出现以下异常,甚是奇怪:   
  2. Caused by: java.sql.SQLException: Io 异常: Got minus one from a read call   
  3. at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)   
  4. at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)   
  5. at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)   
  6. at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:404)   
  7. at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468)   
  8. at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314) ....   
  9.   
  10. 问题在重新启动应用后,应用连接oracle时出错,无法启动应用。   
  11.   
  12. 最后重新启动oracle11g的服务,没有问题了,但是还没有找到具体原因。   
  13.   
  14. 后来在另外一台应用上也发现同样问题,发现问题的严重性,经过分析可能是驱动问题;在不重新启动oracle11g服务的情况下,替换最新版本的jdbc驱动包,问题解决;   
  15.   
  16. 出问题的ojdbc14.jar版本:(查看jar包的MANIFEST.MF文件)   
  17. Manifest-Version: 1.0   
  18. Specification-Title:    Oracle JDBC driver classes for use with JDK14   
  19. Sealed: true   
  20. Created-By: 1.4.2_08 (Sun Microsystems Inc.)   
  21. Implementation-Title:   ojdbc14.jar   
  22. Specification-Vendor:   Oracle Corporation   
  23. Specification-Version:  Oracle JDBC Driver version - "10.2.0.1.0"   
  24. Implementation-Version: Oracle JDBC Driver version - "10.2.0.1.0"   
  25. Implementation-Vendor:  Oracle Corporation   
  26. Implementation-Time:    Wed Jun 22 11:19:45 2005   
  27.   
  28. Name: oracle/sql/converter/   
  29. Sealed: false   
  30.   
  31. Name: oracle/sql/   
  32. Sealed: false   
  33.   
  34. Name: oracle/sql/converter_xcharset/   
  35. Sealed: false   
  36.   
  37.   
  38. 解决问题的ojdbc14.jar版本:   
  39. Manifest-Version: 1.0   
  40. Specification-Title:    Oracle JDBC driver classes for use with JDK14   
  41. Sealed: true   
  42. Created-By: 1.4.2_14 (Sun Microsystems Inc.)   
  43. Implementation-Title:   ojdbc14.jar   
  44. Specification-Vendor:   Oracle Corporation   
  45. Specification-Version:  Oracle JDBC Driver version - "10.2.0.4.0"   
  46. Implementation-Version: Oracle JDBC Driver version - "10.2.0.4.0"   
  47. Implementation-Vendor:  Oracle Corporation   
  48. Implementation-Time:    Sat Feb  11:40:29 2008   
  49.   
  50. Name: oracle/sql/converter/   
  51. Sealed: false   
  52.   
  53. Name: oracle/sql/   
  54. Sealed: false   
  55.   
  56. Name: oracle/sql/converter_xcharset/   
  57. Sealed: false   

 

Java代码  收藏代码
  1. Caught: java.sql.SQLException: Io 异常: Got minus one from a read call  
  2. 使用JDBC连接Oracle时,多次出现上述错误,后来去网上找了下,基本提供的方法有这么几种:  
  3.   
  4. 1:数据库连接满了,扩大数据库连接池  
  5.   
  6. 2:所登录的机子IP不在sqlnet.ora内,加入后重启listerner即可  
  7.   
  8. 3:数据库负载均衡时,指定了(SERVER=DEDICATED),去除这个即可  
  9.   
  10. 4:网管在Oracle配置上限制了该台机子访问Oracle的权限,这个问题基本和2类似,也是修改Oracle配置即可;  
  11. 正在寻找解决办法,现在数据库不归我管,不能重启,扩大连接池治标不治本,而且数据库连接池是我自己写的,盲目的扩大会造成其他用户访问的多种问题,最好是能销毁之前创建的那些链接。哎,这就是代码不规范的坏处啊。创建Connection的时候一定不能忘了close,就算连接池也不要忘了returnConnection啊。  

 

Java代码  收藏代码
  1. 因为,数据库一直都是正常的,所以不可以是那些配置之类的错误。  
  2. 后面DBA查了些东西后,给出结论说是,系统资源不够了。  
  3. --查看系统资源  
  4. SELECT   resource_name,  
  5.          current_utilization,  
  6.          max_utilization,  
  7.          LIMIT,  
  8.          ROUND (max_utilization / LIMIT * 100) || '%' rate  
  9.   FROM   (SELECT   resource_name,  
  10.                    current_utilization,  
  11.                    max_utilization,  
  12.                    TO_NUMBER (initial_allocation) LIMIT  
  13.             FROM   v$resource_limit  
  14.            WHERE   resource_name IN ('processes', 'sessions')  
  15.                    AND max_utilization > 0);  
  16.    
  17. RESOURCE_NAME                  CURRENT_UTILIZATION MAX_UTILIZATION      LIMIT RATE  
  18. ------------------------------ ------------------- --------------- ---------- -----  
  19. processes                                      312             500        500 100%  
  20. sessions                                       317             509        555 92%  
  21. 发现是资源不足。  
  22. 处理方法是:  
  23. alter system set processes=1000 scope=spfile;  
  24. alter system set sessions=1110 scope=spfile; 然后重启数据库  
  25.    
  26. 只是,我重启之后值也都下降了,估计还有其他原因导致资源不足的吧。 
原文地址:https://www.cnblogs.com/lcword/p/8228480.html