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