我需要从服务中获取数据并将其插入数据库。以下是有关服务的一些信息:我必须从服务中获取 id 并根据该 id 获取数据。该操作每天进行一次。每天必须插入大约 10.000 个 ID 的数据。获取 id 列表所需的时间大约为 20 秒,获取该 id 的数据从 0.5 到 9 秒不等。
我必须选择:
第一个选项是:
- 从 Web 服务获取所有数据,将所有内容存储在 List<>
- 对该 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 消耗,而第二个选项的坏处是多次打开和关闭连接。现在我想现在将在 List<> 中存储大量数据会导致内存异常或 C# 将处理这个?我应该使用哪个选项?