0

我需要从服务中获取数据并将其插入数据库。以下是有关服务的一些信息:我必须从服务中获取 id 并根据该 id 获取数据。该操作每天进行一次。每天必须插入大约 10.000 个 ID 的数据。获取 id 列表所需的时间大约为 20 秒,获取该 id 的数据从 0.5 到 9 秒不等。

我必须选择:

第一个选项是:

  1. 从 Web 服务获取所有数据,将所有内容存储在 List<>
  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. 打开连接将数据插入数据库关闭连接并重复步骤

    代码示例:

    //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# 将处理这个?我应该使用哪个选项?

4

1 回答 1

2

两者似乎都不合适恕我直言。当您一一插入时,不使用任何事务。如果一个或多个失败而其他人致力于数据库怎么办?

如果您尝试在一次操作中插入全部,如果一次失败,则所有事务都将失败,那么数据库中将不会有更新(最好创建一个事务,您提供的代码中没有使用该事务)。

您可以选择两全其美;创建更小的块,例如 100 个项目。然后尝试将这些插入事务中。然后插入另外 100 个。如果其中任何一个事务失败,只需尝试再次运行该事务。

关于内存消耗的问题;它仅取决于您使用的实体,没有人可以直接回答。

于 2013-02-08T09:08:28.690 回答