0

従来のWebサービスで使用されている次のWebメソッドがあります。

[WebMethod(Description = "Get Bulk Data")]
public string[] getBulkData(string[] arrInput)
{
    string[] arrResults = new string[arrInput.Length];  
    using(SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["mydb"].ToString()))
    {
        conn.Open();
        //some db operations...
        for (int arrIndex = 0; arrIndex < arrInput.Length; arrIndex++) //arrInput size can be very large
        {
             arrResults[arrIndex] = getResult();
        }
    }
    return arrResults;            
}
private string getResult()
{
    string r;
    using (SqlConnection thisConn = new SqlConnection(ConfigurationManager.ConnectionStrings["mydb2"].ToString()))
    {
        //some db operations
        //assign values to r
    }
    return r;
}

WebメソッドはgetBulkData、文字列の配列を受け取り、データベースにクエリを実行して、同じサイズの結果の配列を返します。getResult()結果は、データベースにもクエリを実行するプライベートメソッドから取得されます。

ここでそれが正しい実装であるかどうかはわかりませんが、getBulkDataのパフォーマンスに影響を与える可能性のある複数のクエリデータベースがあるため、そうではないと言う傾向があります。どうやら、その配列に含まれる要素が多いほど、処理に時間がかかります。

getBulkData()でthisConnオブジェクトを作成し、それをgetResultに渡すと、パフォーマンスの向上という点で違いはありますか?そして、この場合、大きな配列を処理するための最良の方法は何でしょうか?

どうもありがとう。

4

1 に答える 1

0

データベーストランザクションの処理には時間がかかります。ループでデータベースに数百回または数千回クエリを実行している場合、パフォーマンスは間違いなく打撃を受けます。可能であれば、GetResultメソッドを1回だけ起動するように変更してみてください。ただし、結果はIEnumerableタイプのプロパティに保存してください。これにより、すべてのレコードがコンピューターのメモリに配置され、LINQを使用してコンピューターに対してクエリを実行できるようになります。このアプローチを使用すると、パフォーマンスが大幅に向上します。ここで例を見ることができます。

于 2013-01-16T04:08:15.990 に答える