[size=medium]
通常,我們的應用系統,如果要做一次全量資料的讀取,大多數時候,採用的方式會是使用分頁讀取的方式,然而
分頁讀取的方式,在大資料量的情況下,在solr裡面表現並不是特別好,因為它隨時可能會發生oom的異常,在solr裡面
通過rows和start引數,非常方便分頁讀取,但是如果你的start=1000000 rows=10,那麼solr裡面會將前面100萬元資料的索引資訊讀取在記憶體裡面,這樣以來,非常耗記憶體,所以在solr裡面,分頁並不適合深度分頁。
深度分頁在solr裡面,更推薦使用游標的方式,游標是無狀態的,不會維護索引資料在記憶體裡面,僅僅記錄最後乙個doc的計算值類似md5,然後每一次讀取,都會如此記錄最後乙個值的mark,下一次通過這個mark便能快速的定位到第二頁上,如此往復,便能完成整個資料的讀取。而且耗費記憶體非常少。
假如現在有排好隊的10個人等待買飯,而乙個房間裡面最多一次只能進2個人,那麼我們就可以將這個2個人,編號順序,1和2,他們打完飯後,讓2號的人通知,下一組2個人,進來打飯,如此往復
所有人都能吃到飯,這就類似solr中游標的使用。
使用游標的方式讀取資料,也有一些約束或者缺點:
(1)查詢條件裡面必須有cursormark引數,而且必須不能有start引數
(2)查詢的條件裡必須按照主鍵排序(公升序或降序),如果沒有這個條件,主鍵重複,那麼會造成多個游標的mark值,這樣以來下一次請求就不知道如何定位了,而且有可能出現重複讀資料的情況
(3)如果乙個分頁的系統,按照指定頁碼跳轉的功能,這樣實現的功能是實現不了的,因為游標一旦讀取了,就不能再返回上一次的位置了,這種業務最好使用start+rows搞定。
solrj實現**例子:
[/size]
//游標查詢
public static void cursorquery()throws exception
//如果兩次游標一樣,說明資料拉取完畢,可以結束迴圈了
if (cursormark.equals(nextcursormark))
cursormark = nextcursormark;
}//關閉連線
sc.close();
}
[size=medium]
[url]
[/size]
[b][color=green][size=large]
[/size][/color][/b]
[img]
SQL 使用游標進行遍歷
前兩天乙個同事大叔問了這樣乙個問題,他要對錶做個類似foreach的效果,問我怎麼搞,我想了想,就拿游標回答他,當時其實也沒用過資料庫中的游標,但是以前用過ado裡面的,感覺應該差不多。首先,讓我們先來建張測試表 use loadtest2010 create table testcursor 建立...
如何避免使用游標
如何避免使用游標 文章分類 資料庫 問題的提出 我們在根據乙個結果集的內容,處理另乙個結果集的時候,一般的會考慮到使用下面形式的游標 游標定義 開啟游標 從游標中取第一條資料 迴圈開始,以游標取數後的狀態為迴圈控制條件 修改相關資料表的內容 從游標中取下一條資料 迴圈結束 關閉游標 上面的流程在處理...
Oracle儲存過程中如何使用游標
本儲存過程的功能 把test tbl2中與test tbl1中id相同但salary不同的記錄中的salary的值更新為test tbl1中的salary的值 建立儲存過程 create or replace procedure p update test tbl2 is 定義游標 cursor c...