我需要從服務中獲取數據並將其插入數據庫。 以下是關於服務的一些信息:我必須根據服務ID獲取數據並獲取數據。該操作每天完成一次。每天必須插入大約10.000個ID的數據。獲得ID列表所需的時間大約爲20秒,獲取該ID的數據從0.5秒到9秒不等。將數據存儲在內存中,然後插入所有數據並逐個插入
我不得不選擇:
第一個選項是:
- 從web服務,存儲所有信息列表獲取所有數據<>
- 作出了List <>
- 一些操作
打開連接立即將所有內容插入到數據庫中,然後關閉連接
代碼示例:
//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(); }
第二個選項是:
- 獲得單獨從服務數據 對這些數據
- 做出必要的操作
打開連接插入數據到數據庫緊密結合並重復步驟
代碼示例:
//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#將處理這個?我應該使用哪個選項?
您的問題的答案完全取決於您處理的數據量。您是否使用代表性數據集分析了兩個代碼? – Paolo
而不是去檢索每個ID的myClass數據的服務,您可以直接接收myClass的數組(或列表)爲更改的ID?減少往返服務應該會提升性能。而連接問題並不是連接池激活的真正問題。 – Steve
@Paolo你能解釋一下嗎? –