2009-11-06 106 views
1

我使用一個會話變量,從1頁傳遞一個數據表到另一個。有時數據表可以包含超過100,000條記錄。運行幾次後,我會拋出一個內存不足異常,所以我想我有幾個問題?Session.Remove()在c#中清除內存?

是會議來處理這個最好的方法是什麼?

不Session.Clear( 「會議」)從內存中釋放出來?如果沒有,是否有任何東西從內存中釋放會話?

如果我一個數據表存儲到Session對象,然後我的另一個數據表存儲到同一個會話對象,它繼續使用內存或不把它寫在現有的Session對象?

+0

究竟爲什麼你傳遞一個數據表100,000記錄在周圍的會議?當然有更好的方法來做到這一點。 – LukeH 2009-11-06 17:19:50

+0

這就是爲什麼我問的問題,因爲我知道這是做一個荒謬的方式,有一個更好的辦法,但我不知道。 – Xaisoft 2009-11-06 17:21:23

回答

5

我會認爲你是在談論進程內會話狀態。

你實際上並沒有存儲數據表本身的會話。您將存儲對DataTable的引用。因此,當您創建一個新的DataTable並將其添加到會話中時,您只需簡單地覆蓋該參考。在內存中的某個位置仍然有兩個DataTable,直到垃圾收集清除任何沒有實時引用的數據表。

請記住,垃圾收集在.NET是非確定性。也就是說,將對象設置爲null不會立即釋放內存。它只是標記它,並在將來的某個時刻,垃圾收集器可能會看到死對象並釋放與其關聯的內存。

你可能想,如果你運行內存重新考慮你的設計。這可能是最好有第二頁從緩存層再次重新獲取數據,或許可以從數據庫本身(可能是應用程序服務器上實現由另一個海報建議),或也許。

+0

In-Process是什麼意思?我會將Session [「datatable」]設置爲null,以使垃圾回收器在某個時間釋放它或將數據表設置爲null。另外,我不清楚應用程序服務器是什麼? – Xaisoft 2009-11-06 17:25:31

-1

使用應用服務器層來保存數據和每個頁面應該從那裏......

+0

什麼是應用服務器層?你可以用一個例子來闡述一下嗎?謝謝 – Xaisoft 2009-11-06 17:15:06

-1

我的第一個問題是,爲什麼你需要將整個數據庫存儲在會話或應用程序?這裏是一個good article是越過所有選項,並建議對存儲大量的會話或應用程序緩存數據。你想通過這樣做解決什麼問題?

編輯:

你在該網頁上同時顯示所有的數據?恩。向下滾動10000個記錄。如果這樣聽起來不太友好(假設)。你有沒有考慮過分頁數據?你可以有一頁50個記錄和n個頁面。這將使數據調用速度快了很多,然後你可以實現過濾,排序等

+0

我的主要問題是,當我獲取數據時,有太多需要一段時間,有時需要幾分鐘。我將它存儲在Session中,以便可以在另一個頁面上訪問它,但這會導致內存問題。如果我再次獲取數據,則需要更多時間,但其他一些海報已經討論過再次獲取數據。 – Xaisoft 2009-11-06 17:27:18