Tomcat服務器下的應用鏈接Oracle時報錯,出現如下異常:html
java.sql.SQLException: Io 異常: Got minus one from a read call
查詢數據庫鏈接狀況:java
- SQL> select username,count(username) from v$session where username is not null group by username;
- USERNAME COUNT(USERNAME)
- ------------------------------ ---------------
- SP2 33
- YWTWEBDB 14
- SYS 2
- INFO 1
- MF 658
- UC 183
- 6 rows selected.
- SQL> select count(*) from v$session where status='ACTIVE';
- COUNT(*)
- ----------
- 675
緣由不明:表現是數據庫的鏈接數比較大,臨時處理是重啓數據庫,重啓後解決,但估計不是最終的解決方法。。重啓後的鏈接狀況:sql
- 正常的時候的數據庫鏈接數:
- SQL> select username,count(username) from V$SESSION where username is not null group by username ;
- USERNAME COUNT(USERNAME)
- ------------------------------ ---------------
- SP2 11
- YWTWEBDB 2
- SYS 1
- INFO 1
- MF 79
- MYJIN 1
- UC 19
- 7 rows selected.
如下收集了網上此問題的相關解決方法以下:數據庫
http://www.iteye.com/topic/1126453服務器
http://blog.sina.com.cn/s/blog_529aacbd0100t22b.htmlsession
http://hi.baidu.com/xjieni/item/1afbff62dab025167cdecc21oracle
摘錄以下:負載均衡
- 今日無心中用java鏈接oracle時,竟出現如下異常,甚是奇怪:
- Caused by: java.sql.SQLException: Io 異常: Got minus one from a read call
- at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:134)
- at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:179)
- at oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:333)
- at oracle.jdbc.driver.OracleConnection.<init>(OracleConnection.java:404)
- at oracle.jdbc.driver.OracleDriver.getConnectionInstance(OracleDriver.java:468)
- at oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:314) ....
- 問題在從新啓動應用後,應用鏈接oracle時出錯,沒法啓動應用。
- 最後從新啓動oracle11g的服務,沒有問題了,可是尚未找到具體緣由。
- 後來在另一臺應用上也發現一樣問題,發現問題的嚴重性,通過分析多是驅動問題;在不從新啓動oracle11g服務的狀況下,替換最新版本的jdbc驅動包,問題解決;
- 出問題的ojdbc14.jar版本:(查看jar包的MANIFEST.MF文件)
- Manifest-Version: 1.0
- Specification-Title: Oracle JDBC driver classes for use with JDK14
- Sealed: true
- Created-By: 1.4.2_08 (Sun Microsystems Inc.)
- Implementation-Title: ojdbc14.jar
- Specification-Vendor: Oracle Corporation
- Specification-Version: Oracle JDBC Driver version - "10.2.0.1.0"
- Implementation-Version: Oracle JDBC Driver version - "10.2.0.1.0"
- Implementation-Vendor: Oracle Corporation
- Implementation-Time: Wed Jun 22 11:19:45 2005
- Name: oracle/sql/converter/
- Sealed: false
- Name: oracle/sql/
- Sealed: false
- Name: oracle/sql/converter_xcharset/
- Sealed: false
- 解決問題的ojdbc14.jar版本:
- Manifest-Version: 1.0
- Specification-Title: Oracle JDBC driver classes for use with JDK14
- Sealed: true
- Created-By: 1.4.2_14 (Sun Microsystems Inc.)
- Implementation-Title: ojdbc14.jar
- Specification-Vendor: Oracle Corporation
- Specification-Version: Oracle JDBC Driver version - "10.2.0.4.0"
- Implementation-Version: Oracle JDBC Driver version - "10.2.0.4.0"
- Implementation-Vendor: Oracle Corporation
- Implementation-Time: Sat Feb 2 11:40:29 2008
- Name: oracle/sql/converter/
- Sealed: false
- Name: oracle/sql/
- Sealed: false
- Name: oracle/sql/converter_xcharset/
- Sealed: false
- Caught: java.sql.SQLException: Io 異常: Got minus one from a read call
- 使用JDBC鏈接Oracle時,屢次出現上述錯誤,後來去網上找了下,基本提供的方法有這麼幾種:
- 1:數據庫鏈接滿了,擴大數據庫鏈接池
- 2:所登陸的機子IP不在sqlnet.ora內,加入後重啓listerner便可
- 3:數據庫負載均衡時,指定了(SERVER=DEDICATED),去除這個便可
- 4:網管在Oracle配置上限制了該臺機子訪問Oracle的權限,這個問題基本和2相似,也是修改Oracle配置便可;
- 正在尋找解決辦法,如今數據庫不歸我管,不能重啓,擴大鏈接池治標不治本,並且數據庫鏈接池是我本身寫的,盲目的擴大會形成其餘用戶訪問的多種問題,最好是能銷燬以前建立的那些連接。哎,這就是代碼不規範的壞處啊。建立Connection的時候必定不能忘了close,就算鏈接池也不要忘了returnConnection啊。
- 由於,數據庫一直都是正常的,因此不能夠是那些配置之類的錯誤。
- 後面DBA查了些東西后,給出結論說是,系統資源不夠了。
- --查看系統資源
- SELECT resource_name,
- current_utilization,
- max_utilization,
- LIMIT,
- ROUND (max_utilization / LIMIT * 100) || '%' rate
- FROM (SELECT resource_name,
- current_utilization,
- max_utilization,
- TO_NUMBER (initial_allocation) LIMIT
- FROM v$resource_limit
- WHERE resource_name IN ('processes', 'sessions')
- AND max_utilization > 0);
- RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION LIMIT RATE
- ------------------------------ ------------------- --------------- ---------- -----
- processes 312 500 500 100%
- sessions 317 509 555 92%
- 發現是資源不足。
- 處理方法是:
- alter system set processes=1000 scope=spfile;
- alter system set sessions=1110 scope=spfile; 而後重啓數據庫
- 只是,我重啓以後值也都降低了,估計還有其餘緣由致使資源不足的吧。