3

JOB を使用してテーブル データを継続的に監視しています。JOB 内で、SQLCLR SP を呼び出しています。SQLCLR SP が実行されます。while ループの前に、SQL 接続を開きます。forループ内では、1回の接続でデータベースに1000〜10000回アクセスします。作業が完了するまで DB 接続を閉じません。

            SqlConnection connection = null;
            try
            {
                using (connection = new SqlConnection("context connection=true"))
                {
                    connection.Open();

                    DataTable dt;
                    SqlDataAdapter adp=new SqlDataAdapter("select * from tableName",CnStr);
                    DataSet ds=new DataSet();
                    adp.Fill(ds,"TableName");
                    dt= ds[0];

                    //dt.Rows.count may be range from 1000-10000

                    for(i=0;i<dt.Rows.count;i++)
                    {
                        int id = int.Parse(dt.Rows[i][0].ToString());

                        SqlCommand command = new SqlCommand("select * from table1 where IsParsed=0 and Id=" + id, connection);
                        SqlDataReader r1 = command.ExecuteReader();

                        SqlCommand command = new SqlCommand("Insert into table2 (values)", connection);
                        int r2 = command.ExecuteNonQuery();

                        //Always get table1 data which has IsParsed=0. Get those rows manipulate those rows data and 
                        // insert into datatable table2 and update those rows to IsParsed=1

                        SqlCommand command = new SqlCommand("Update table1 set IsParsed=1 where  id=@id", connection);
                        int r3 = command.ExecuteNonQuery();

                        // Run the Billing Logic here

                        // Insert into Billing Table 
                        SqlCommand command = new SqlCommand("Insert into Billing(values)", connection);
                        int r2 = command.ExecuteNonQuery();

                    }
                }
            }
            catch (Exception ex)
            {
            }
            finally
            {
                connection.close();
            }

このアプローチに問題はありますか? このような接続を使用しても問題はありますか? 適切な提案を提供する..

単一の接続で複数のコマンドを実行するためのより良い方法の記事 を読みました

ここでは、コンテキスト接続を使用して、単一の接続で数千のコマンドを実行しています。コンテキスト接続での接続プールの考慮事項はありますか..? 接続ごとに単一のコマンドを実行する場合と、単一の接続で複数のコマンドを実行する場合のパフォーマンスはどうですか?

また、コンテキスト接続と通常の接続の両方のケースで同じ結果が得られることを知りたいですか? SP は DB 自体にデプロイされるためです。私が間違っている場合は、私を修正してください。

4

2 に答える 2

3

1 つの接続で多数のクエリを実行しても問題はありません。コンテキスト接続で SQL CLR プロシージャをどのように使用しているか。MSDN で言及されているように、次のように述べられています。

通常、コンテキスト接続を使用すると、パフォーマンスが向上し、リソースの使用量が少なくなります。コンテキスト接続はインプロセスのみの接続であるため、ネットワーク プロトコルとトランスポート層をバイパスしてサーバーに "直接" 接続し、Transact-SQL ステートメントを送信して結果を受け取ることができます。認証プロセスもバイパスされます。

コンテキストと通常の接続の詳細については、このリンクを参照してください。

于 2013-03-16T09:21:26.930 に答える
2

いいえ。1 つの接続で多数のクエリを実行しても問題ありません。

1000 以上の行のそれぞれに対して 3 つの SQL クエリを実行するために接続を開いたり閉じたりすると、コードのパフォーマンスが低下する可能性があります。

于 2013-03-16T05:31:08.580 に答える