0

サービスからデータを取得してデータベースに挿入する必要があります。サービスに関する情報は次のとおりです。サービスからIDを取得し、そのIDに従ってデータを取得する必要があります。この操作は1日に1回行われます。毎日約10.000のIDのデータを挿入する必要があります。IDリストの取得に必要な時間は約20秒で、そのIDのデータの取得は0.5秒から9秒までさまざまです。

私はオプションをしなければなりません:

最初のオプションは次のとおりです。

  1. Webサービスからすべてのデータを取得し、すべてをリストに保存します<>
  2. そのリストに対していくつかの操作を行います<>
  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();
    }
    

2番目のオプションは次のとおりです。

  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の消費であり、2番目のオプションの悪い面は何度も接続を開いたり閉じたりすることだと思います。List <>に多くのデータを保存すると、メモリ例外が発生するのでしょうか、それともC#で処理されるのでしょうか?どのオプションを使用する必要がありますか?

4

1 に答える 1

2

どちらも適切ではないようです。1 つずつ挿入する場合、トランザクションは使用されません。1 つまたは複数の障害が発生し、他の障害がデータベースにコミットされた場合はどうなりますか?

すべてを 1 回の操作で挿入しようとすると、1 つが失敗するとすべてのトランザクションが失敗し、データベースに更新はありません (提供したコードで使用しないトランザクションを作成することをお勧めします)。

両方の長所を活かすことができます。100 アイテムなど、より小さなチャンクを作成します。次に、これらをトランザクションに挿入してみてください。次に、他の 100 を挿入します。このトランザクションのいずれかが失敗した場合は、トランザクションをもう一度実行してみてください。

RAM消費に関する問題について; 使用しているエンティティに依存するだけで、誰も直接の答えを示すことはできません。

于 2013-02-08T09:08:28.690 に答える