問題:
使用Java代碼鏈接Oracle執行SQL語句,報錯:java
SQL state [null]; error code [17410]; 沒法從套接字讀取更多的數據;nested exception is java.sql.SQLException: 沒法從套接字讀取更多的數據
可是將SQL語句放到navicat或者plsql上執行並無報錯。sql
問題探究:
查了網上相關文章,有說表空間不足的;有說oracle驅動包有問題的;有說jdbc驅動存在問題,換成odbc後解決的,但針對遇到的問題都沒有效果。
錯誤的無非就是兩個方向:一是Oracle數據庫方面,二是Java代碼方面。
數據庫
首先咱們來排查一下Oracle的日誌:
Oracle日誌分別放置於/oracle/oracle/diag/rdbms/rac/rac1/trac和/oracle/oracle/diag/rdbms/rac/rac1/alert目錄下,也可使用select name ,value from v$diag_info命令來查詢。
查看日誌:
經過翻看log.xml文件,咱們能夠看到詳細的日誌信息:
進入到/home/oracle/app/oracle/diag/rdbms/helowin/helowin/trace/路徑:
bash
more helowin_ora_28085.trc
到這裏咱們清楚的看到ORA-07445的報錯信息。
服務器
問題解決:
ORA-07445傳說中是由於Oracle的bug所致使的。
通常狀況下,ORA-600被證實爲oracle的內部錯誤,一般由oracle的bug引發,須要打oracle相應的補丁程序。而當oracle服務器進程從操做系統收到一個致命的錯誤信息時會拋出ora-07445錯誤,這個錯誤能夠被oracle後臺進程或者用戶進程激發。當錯誤被拋出時,系統會首先寫一個錯誤日誌到alert.log文件中,而後會寫跟蹤文件到user_dump_dest或background_dump_dest中;最後會將主存信息轉儲到core_dump_dest中。
操做系統有不少的非法操做設計,一個常常會碰到的狀況就是,當一個進程訪問一個非法地址(好比系統預留地址)時致命錯誤將會產生。
Ora-07445錯誤是一個很是普通的錯誤,可能在oracle的任何代碼中產生,該錯誤代碼更詳細的描述須要進一步跟蹤其跟蹤文件。
session
接下來的解決方案就簡單了,在數據庫級別執行如下sql,以設置隱含參數,便可避免出現此問題:oracle
alter system set "_optimizer_connect_by_cost_based" = false scope=both;
或者在session級別執行下列sql:app
alter session set "_optimizer_connect_by_cost_based" = false scope=both;
修改後從新啓動Oracle,原來的報錯就沒有了。spa