對大型PostgreSQL表運行以下代碼時,NpgsqlDataReader對象會阻塞,直到抓取所有數據。如何阻止NpgsqlDataReader阻塞?
NpgsqlCommand cmd = new NpgsqlCommand(strQuery, _conn);
NpgsqlDataReader reader = cmd.ExecuteReader(); // <-- takes 30 seconds
我怎樣才能讓它表現得不會預取所有的數據?我想逐行瀏覽結果集,而不是一次將所有15 GB的內容全部讀取到內存中。
我知道在Npgsql 1.x中存在這類問題,但我在2.0上。這是針對XP/Vista/7上的PostgreSQL 8.3數據庫。我也沒有任何時髦的「強制Npgsql預取」我的連接字符串中的東西。我完全喪失了爲什麼會發生這種情況。
我會upvote,但我沒有聲望呢。我的備份計劃是按照您的建議手動聲明遊標。理想情況下,我希望DataReader「只是工作」。 :)是不是DataReader的全部重點,它是一種快速訪問數據的方式?所以這種行爲對我來說似乎很陌生。 – 2010-06-06 14:36:05
@Swingline Rage:.net驅動程序甚至可能不如JDBC驅動程序成熟。我相信,postgresql協議有一種機制,用於使用遊標獲取任何查詢的結果(SQL命令是一個單獨的更高級別的接口) - 也許Npgsql根本不支持使用寫入的內容? Istr傳統的PQexecutequery()調用實際上只是一次返回整個結果,並且可能試圖將其保留在OS緩衝區中,並且處理它的peicemeal會很糟糕... – araqnid 2010-06-06 16:06:06
是的好點(並且有點令人沮喪)。我會更詳細地研究這一點。我一直在忘記Npgsql是開源的,所以答案就在那裏。但是最後一次看,我發現代碼很難遵循,就像數據內部一樣。 – 2010-06-09 16:13:09