OracleDataReader導致的ORA-01000【轉】

錯誤的中文解釋爲:遊標超出最大連接數

 遊標具體是個什麼東西就不多說了,只說明一點:遊標有顯式遊標和隱式遊標,並不是沒有顯式的調用遊標就不會使用到遊標,有些SQL語句是會調用隱 式遊標的,這就是爲什麼有人沒有顯式的調用遊標卻出現了上面的錯誤提示。

 出現這種錯誤提示大多是因爲OracleConnection,OracleDataReader使用完後沒有正常的關閉造成的。只要使用後立即 關閉掉就可以了,即調用相應的Close()就可以了。對於OracleDataReader來說一定要調用Close()關掉。

用以上方法就可以解決問題,下面是我解決問題的過程,畢竟“授之以魚,不如授之以漁”

OracleDataReader比較特殊,使用完後如果沒有關掉,只關掉了OracleConnection,Oracle數據庫中的遊標還是會 存在的。當系統運行一段時間,未關掉的遊標會越來越多,當超出ORACLE設置的最大值時也就出現了上訴的錯誤。這個最大值以ORACLE10g爲例是 300,保存在oracle\product\10.1.0\admin\orcl\pfile目錄下的init.ora文件的open-cursors 參數裏。

首先對想通過吧open—sursors這值改大些來避免問題的人說,這樣改的話有可能會避免該問題,使其以後不再出現,但是避免問題不是解決問題 的好辦法,因爲這樣處理問題會留下很大的隱患,問題不知道什麼時候又會出現。到時候在哭就來不及了。要發現問題的產生原因,然後解決它。

以下是發現問題的方法。

 select * from v_$open_cursor where user_name='****'

以sys用戶登錄後,執行以上語句試下能看到什麼,其中那個****是程序中連接數據庫的用戶名。執行後可以看到這是查看****用戶未釋放的遊標 是有那些SQL語句執行的。是不是很繞口的一句話。動手試下你就會明白了。

如果吧SQL語句改成 select count(*) from v_$open_cursor where user_name='****' 又會怎樣呢?那就是這個用戶當前有幾個遊標未釋放。看這個值有什麼意義呢?前面提到過ORACLE10G的默認最大遊標數是300吧。對了。當查看的這個 值超過300就出現問題了。你可以找個調用了OracleDataReader的地方,在執行代碼前後分別執行下這個SQL語句,你就明白遊標數爲什麼會 一致增大,最後導致超出最大遊標數了。

如果在遇到ORACLE遊標的問題不妨用這種方法找找產生這些遊標的地方到底在哪裏。願意的話也可以用 OracleDataReader執行不同的SQL語句,看看那些SQL語句會調用到隱式遊標。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章