2016-09-22 55 views
0

我必須從我的數據庫獲取大量不同的記錄(1000.000)才能從此數據構建報告。我的數據庫在遠程系統上。現在我爲每個報告都有不同的sql語句。這個sql語句被髮送到服務。該服務填充DataSet並將其返回給我的應用程序。現在我可以將DataSet綁定到我的報告。 問題是具有多條記錄的DataSet具有巨大的內存消耗。我的意思是如果我加載數據的內存上升到1GB一個負載。從數據庫到代碼的大型未知數據

在沒有這種內存消耗的情況下是否可以選擇加載數據? 我的意思是我已經像使用NHibernate一樣使用ORM,但問題是我不知道將要加載的數據,有數百個報告可以更改不同的sql語句,所以我無法創建數百個類來映射...

編輯:

下面是我用我的示例代碼:

 DataSet dataSet = new DataSet(); 
    try 
    { 
     using (FbConnection connection = new FbConnection(strConnString)) 
     { 
      connection.Open(); 
      using (FbCommand cmd = 
       new FbCommand(
       "SELECT * FROM CUSTOMERS;", 
       connection)) 
      { 
       FbDataAdapter fbd = new FbDataAdapter(cmd); 
       fbd.Fill(dataSet); 
       // This is what the default ADO.Net provider can do.. 
       //SqlCommand command = new SqlCommand(queryString, connection); 
       //System.Xml.XmlReader reader = command.ExecuteXmlReader(); 
      } 
     } 

    } 
    catch (Exception ex) 
    { 

    } 

回答

0

你應該問的問題是:有多少數據是,什麼是內存開銷。如果OVERHEAD很大,則需要找到一個更好的數據結構。如果DATA本身對於內存太大,則需要探索一次只將其中一部分帶入內存的方法。

在這兩種情況下,使用NHibernate報告這樣大的卷是令人懷疑的 - 使用現有的映射類來構造查詢可能是有用的,但是您必須包括投影到簡單的未映射DTO類或對象[]或類似的,以避免NHibernate爲所有結果實例化映射類 - 後者對性能和內存消耗都不利。

哦,你是不是說你有一個Web服務返回一個DataSet?一般來說,這被認爲是不好的風格,因爲DataSet類是特定於Microsoft的,並且出於各種其他原因(http://www.hanselman.com/blog/ReturningDataSetsFromWebServicesIsTheSpawnOfSatanAndRepresentsAllThatIsTrulyEvilInTheWorld.aspx)。

+0

該web服務僅供我的應用程序使用。我必須從數據庫加載數據,並且DataSet是實現它的唯一方法,按照我使用的firebird和ADO.Net提供程序的方式。如果我將DataSet解析爲XML或Json或其他內容,則會出現額外的性能問題。我的意思是,如果有可能直接將數據加載到XML中,那會更好,但目前爲止還沒有發現。唯一的方法是將其加載到DataSet中,然後將其寫入XML。 oroginal SQLCommand類具有類似於ExecuteXmlReader()的東西,但沒有任何此類Firebird提供者(FBCommand)。 – Franki1986

+0

這裏有些東西...... ADO.Net的基本返回結構是* DataReader *,而不是DataSet。雖然框架提供了將DataReader讀入DataSet的方便方法,但據我所知,這是ADO.Net的用戶必須明確執行的。 –

+0

我放了一些代碼來解釋我的意思。 – Franki1986