天天看點

帆軟報表FineReport資料連接配接中遊标問題解決方案彙總

1. 概念

在資料庫中, 遊标是一個十分重要的概念。遊标是一種能從包括多條資料記錄的結果集中,每次提取一條記錄的機制。

用SQL語言從資料庫中檢索資料後,結果放在記憶體的一塊區域中,往往是一個含有多個記錄的集合。遊标機制允許使用者在此結果集内逐行通路每條記錄,并按照使用者自己的意願來顯示和處理這些記錄。

2. 标準寫法(以oracle為例)

declare

ursor mycur is select *from books;----定義遊标

myrecord books%rowtype; ----%rowtype表示行資料類型,myrecord存儲books中的一行資料

begin

open mycur;

fetch mycur into myrecord; ----存入一行資料至myrecord

while mycur%found loop ----%found布爾型,如果有行傳回,則為true

dbms_output.put_line(myrecord.books_id||','||myrecord.books_name); ---輸出資訊

fetch mycur into myrecord; ----存入下一行

end loop;

close mycur;---關閉遊标

end;

/

說明:

使用遊标逐行通路查詢books表獲得的結果集,輸出每條記錄中的bookid與bookname。從該例子可以看出,遊标包含兩方面的内容:

遊标結果集:執行其中的Select語句所得到的結果集。

遊标位置:一個指向遊标結果集内的某一條記錄的指針。

利用遊标可以單獨操縱結果集中的每一行。遊标在定義以後存在兩種狀态:關閉和打開。當遊标關閉時,其查詢結果集不存在;隻有當遊标打開時,才能按行讀取或修改結果集中的資料。一般使用完後不寫close mycur也不會出現編譯錯誤。

3. 遊标的優點

允許程式對由查詢語句select傳回的行集合中的每一行執行相同或不同的操作,而不是對整個行集合執行同一個操作;

它還提供對基于遊标位置而對表中資料進行删除或更新的能力;

遊标作為面向集合的資料庫管理系統和面向行的程式設計兩者聯系起來,使兩個資料處理方式能夠進行溝通。

上面章節,我們對遊标的内容有了些詳細的了解。但在使用遊标時,往往會出現些問題。下面就打開的遊标太多時,出現的一些問題作介紹。

4. 常見報錯

如:在Oracle資料庫中,會報如下資訊:

Caused by: ORA-01000: 超出打開遊标的最大數

Oracle系統中,以參數open_cursors來限制打開的遊标數,當打開遊标超過這個數的時候就會報這個錯,提示超出打開遊标的最大數。遊标個數理論上沒有上限,也不是越大越好。

有這樣一個測試顯示:當這個open_cursor數值大了一定程度之後,會使得記憶體縮水,縮水的表現就是連接配接數減少。

如上結論可具體測試,其測試結果如下:

分别設定為以下值,測試資料庫的連接配接,在同樣的記憶體配置下,與使用者可以連接配接的數(獨占模式)有很大的差別。

open_cursors=6000000000 -------------連接配接數45

open_cursors=300 ---------------------連接配接數超過500.

由以上測試可知,當open_cursors擴大2000萬倍之後連接配接數變為原來的十分之一,是以open_cursors的大小對連接配接數的影響不大,隻要不要在千萬級上增加,一般的幾千幾萬跟幾十,對連接配接數的影響甚微。

4.1 解決方案

按照遊标的正規寫法,打開遊标使用完之後,就需關閉遊标。

應避免遊标打開過大,其可通過修改open_cursors大小,使其盡可能大。

4.2 檢查open_cursors數值及修改方法

SQL>show parameter open_cursors; ---顯示參數值

SQL>alter system set open_cursors = 1000; ---修改參數值為1000

SQL>commit;----送出

修改成功。

繼續閱讀