0

データのストリーム (1 秒あたり 100 ~ 150 パケット) を収集し、ストアド プロシージャを使用して、処理されたパケットを MySQL データベースに送信しようとしています。

comm = new MySqlCommand("cantm_insert", conn);
comm.CommandType = CommandType.StoredProcedure;

comm.Parameters.AddWithValue("?_tmsid", tmsid);
comm.Parameters.AddWithValue("?_time", DateTime.Now.ToOADate());
comm.Parameters.AddWithValue("?_dest", c.Identifier >> 3);
comm.Parameters.AddWithValue("?_source", c[0]);
comm.Parameters.AddWithValue("?_length", c.DataLength);
comm.Parameters.AddWithValue("?_type", c[1]);
comm.Parameters.AddWithValue("?_data", buffer);

comm.executeNonQuery();

この方法では、1 秒あたり 15 ~ 20 パケットしかデータベースに保存できません。できるだけ早くデータをデータベースに保存する必要があります。

MSSQL では、テキスト コマンドの大きなパケット (「select * from tbl;insert into tbl;delete from tbl;」など) を送信できましたが、ストアド プロシージャを使用してパフォーマンスを向上させる方法がわかりません。

4

1 に答える 1

1

コマンドとパラメータオブジェクトを再利用することで、コードのパフォーマンスを向上させることができます。新しいデータポイントを取得するときは、パラメータオブジェクトに値を設定するだけです。すべてのリソース割り当ては、コードのパフォーマンスを低下させます。sprocが何をしているのかわからないので、そこでは役に立ちません。

DB側では、インデックスを削除します。テストを開始する前に切り捨てられるデータ収集テーブルを実装する場合があります。テスト後、データを「実際の」テーブルに移動します。

あなたはデータストリームのために150-200パケット/秒について言及します。これは平均データですか、それとも連続データですか?パケットがバーストで届く場合は、データ収集用に1つのスレッドを使用し、それらの間にバッファ/キューを配置するdbストレージ用に2番目のスレッドを使用できるためです。次のデータバーストの前にバッファが処理されることを確認します。このようにして、データをドロップしません。

于 2013-02-27T08:17:02.100 に答える