0

データベース(MySQL)にデータを挿入するアプリケーション(C#)があります。プログラムは、タイマーを使用してマルチスレッドで実行されます。

私の質問は次のとおりです。データベースにデータを挿入する最良の方法は何でしょうか。

アプリケーションの例:

タイマーは毎秒刻みます。毎秒データベースに挿入したいデータがありますが、30分ごとのように、後で挿入したいデータがあります。データは常に異なるテーブルに移動しますが、同じデータベースに移動します。

挿入するたびに、常にデータベース接続を開いたり閉じたりしました。その場合、すでに開いている接続を開いたり、他のスレッドによって既に閉じられている接続を使用したりするときに問題が発生しました。その問題を解決するために、タイマーを開始したときに接続を開き、停止したときに接続を閉じました。そのように機能していますが、それほど安全ではありません。

このソリューションを使用すると、データベースが時々混乱することがあります。ローカルデータベースで試してみましたが、リモートデータベースと異なるかどうかはわかりません(正直に言って、ローカルおよびリモートDBでも動作するはずです)。

各ティック後 (または X ティック後) にデータベースにアップロードするデータを収集する追加のメソッドを用意するというアイデアがありました。それがより良い解決策になるかどうかはわかりませんが、今のところより良いアイデアはありません。そのソリューションの問題は、それが乱雑になる可能性があることです(すべてのスレッドがアクセスしてデータを挿入できるグローバルリストが必要だと思います。リストをアップロード/クリアすると問題が発生する可能性がありますスレッドの 1 つがそれにアクセスする可能性があります)。

十分に明確でない場合はお知らせください。任意の提案をいただければ幸いです。

ありがとう

データベース挿入の私のコードは次のとおりです。

con.Open();
MySqlCommand cmd = new MySqlCommand(command, con);
cmd.ExecuteNonQuery();
con.Close();

問題をより理解しやすくするために、ここにいくつかの疑似コードも挿入する必要があると思います。

Timer
foreach(sensor)
{
if sensor reading finished
{
check the type of the sensor
run the right thread
}

スレッドの例:

Thread
Read out data from sensor
insert data to DB

センサーの応答は異なりますが、それでも同じである可能性があります。これが、データベースへの挿入に問題がある理由です。

4

2 に答える 2

2

挿入するたびにデータベース接続を常に開いたり閉じたりしました[...]そのように機能していますが、それほど安全ではありません。

それは確かに最良の方法です。using () {}ブロックで接続を使用すると、安全になります。

このソリューションを使用すると、データベースが時々混乱することがあります。

あなたはそれをもっとうまく説明しなければならないでしょう。

各ティックの後にアップロードするデータを収集する追加のメソッドを持つというアイデアがありました

はい、おそらく余分なスレッドを使用してデータベースにプッシュすることができます(すべきです)。「生産者/消費者パターン」を参照してください

于 2013-01-24T09:34:53.740 に答える
0

単一の接続のみを
使用し、挿入のためにデータを渡す関数を 1 つ使用します。その関数は挿入作業を行います。

お気に入り

func(strQry){ Command cmd = new ...(strQry, conn); cmd.execute...(); }

conn obj を再利用しますが、毎回新しい cmd obj を作成します。

行き詰まったらコメント...

于 2013-01-24T09:38:53.997 に答える