2013-02-08 34 views
0

我需要從服務中獲取數據並將其插入數據庫。 以下是關於服務的一些信息:我必須根據服務ID獲取數據並獲取數據。該操作每天完成一次。每天必須插入大約10.000個ID的數據。獲得ID列表所需的時間大約爲20秒,獲取該ID的數據從0.5秒到9秒不等。將數據存儲在內存中,然後插入所有數據並逐個插入

我不得不選擇:

第一個選項是:

  1. 從web服務,存儲所有信息列表獲取所有數據<>
  2. 作出了List <>
  3. 一些操作

    打開連接立即將所有內容插入到數據庫中,然後關閉連接

    代碼示例:

    //Get datafrom service and store it List<> or some collection 
    TestService client = new TestService(); 
    MyClass changedData; 
    List<MyClass> serviceResult = new List<MyClass>(); 
    
    string[] changedDataIDs = client.GetChangedIDs(); 
    
    foreach (string id in changedDataIDs) 
    { 
        changedData = client.GetData(id); 
        serviceResult.Add(changedData); 
    } 
    
    
    //Make some operttions on that data 
    List<Person> persons = serviceResult.Perons......; 
    
    //Insert everything into database at once 
    string conString = ".."; 
    OracleConnection con = new OracleConnection(conString); 
    OracleCommand cmd = new OracleCommand("MY_STORED_PROCEDURE", con); 
    //Add parameters 
    cmd.Parameters.Add(new OracleParameter(....)); 
    ......... 
    
    try 
    { 
        con.Open(); 
    
        foreach (var item in collection) 
        { 
         //Give values to parameters 
         cmd.Parameters[0] = item.value; 
         cmd.ExecuteNonQuery(); 
        } 
    } 
    finally 
    { 
        con.Close(); 
    } 
    

第二個選項是:

  1. 獲得單獨從服務數據
  2. 對這些數據
  3. 做出必要的操作
  4. 打開連接插入數據到數據庫緊密結合並重復步驟

    代碼示例:

    //Get changed IDs from service 
    TestService client = new TestService(); 
    string[] changedDataIDs = client.GetChangedIDs(); 
    MyClass changedData; 
    Person changedPersonDetails; 
    OracleCommand cmd = new OracleCommand("MY_STORED_PROCEDURE"); 
    //Add parameters 
    cmd.Parameters.Add(new OracleParameter(....)); 
    ......... 
    
    foreach (string id in changedDataIDs) 
    { 
        //Get data individually from service 
        changedData = client.GetData(id); 
    
        //Make needed operations on that data 
        changedPersonDetails = changedData.Person.........; 
    
        //Give values to parameters 
        cmd.Parameters[0] = changedPersonDetails.Contact...; 
    
        //Open connection insert data to databse close connection 
           //ExecuteCommand is a method 
        ExecuteCommand(cmd); 
    } 
    
    
    public int ExecuteCommand(OracleCommand cmd) 
    { 
        int affectedRowCount = 0; 
        OracleConnection con = new OracleConnection(""); 
        cmd.Connection = con; 
    
        try 
        { 
         con.Open(); 
         affectedRowCount = cmd.ExecuteNonQuery(); 
        } 
        finally 
        { 
         con.Close(); 
        } 
    
        return affectedRowCount; 
    } 
    

我認爲,第一種選擇的不好的一面是消耗RAM和第二選擇的不好的一面被打開和關閉連接多次。現在我想現在將存儲到列表中的很多數據>將導致內存異常或C#將處理這個?我應該使用哪個選項?

+2

您的問題的答案完全取決於您處理的數據量。您是否使用代表性數據集分析了兩個代碼? – Paolo

+0

而不是去檢索每個ID的myClass數據的服務,您可以直接接收myClass的數組(或列表)爲更改的ID?減少往返服務應該會提升性能。而連接問題並不是連接池激活的真正問題。 – Steve

+0

@Paolo你能解釋一下嗎? –

回答

2

這兩個似乎都不正確恕我直言。當您逐一插入時,不會採用任何交易。如果一個或多個失敗和其他人致力於數據庫,該怎麼辦?

如果您嘗試在一個操作中插入所有操作,如果一個操作失敗,則所有事務都將失敗,那麼數據庫中將沒有更新(最好創建一個事務,而不是在代碼中使用已提供)。

你可能會與兩全其美;創建更小的塊,例如100個項目。然後嘗試將這些插入到事務中。然後插入其他100.如果這些交易中的任何一個失敗,只需嘗試再次運行該交易。

關於RAM消耗的問題;它只取決於你使用的實體,沒有人能指出直接的答案。

+0

我會插入它們並捕獲異常,如果發生錯誤我會將它寫入日誌並提交其他成功的插入或更新 –

相關問題