前提
Visual Studio 2019
フレームワーク: .NET core 3.1
コンソールアプリケーション
C#でTaskを使って複数のINSERTやUPDATEを繰り返すと、徐々に1件登録・更新を続けていくと少しずつ遅くなってしまいます。最初の数十件は1件目から2件目登録するのにそれほど時間はかかりませんが、数百件目となると1件処理するのに数秒かかるようになりました。
登録や更新しているDBはLocalに構築しています。
実現したいこと
可能であれば、この遅くなる現象が少しでも解消できればと思います。
発生している問題
1件目:00:00:00.86 2件目:00:00:00.73 ~ 100件目:00:00:01.54 101件目:00:00:01.44 ~ 200件目:00:00:03.16 201件目:00:00:03.28
該当のソースコード
C#
private static async Task<bool> ExitPrintImageMain() { try { int listcnt = 0; foreach (var v in TestList) { await UpdTest1TransactionAsync(listcnt); await InsTest1TransactionAsync(listcnt); await InsTest2TransactionAsync(listcnt); await InsTest3TransactionAsync(listcnt); await UpdTest2TransactionAsync(listcnt); await UpdTest3TransactionAsync(listcnt); await UpdTest4TransactionAsync(listcnt); await InsTest4TransactionAsync(listcnt); await UpdTest4TransactionAsync(listcnt); await InsTest5TransactionAsync(listcnt); await InsTest6TransactionAsync(listcnt); listcnt = listcnt + 1; } return true; } catch (Exception e) { Console.WriteLine(System.DateTime.Now + " : " + e.Message); return false; } }
パラメータはもっと沢山ありますが、一部のみ記述しています。
C#
private static async Task InsTest1TransactionAsync(int listcnt) { try { DateTime dt = DateTime.Now; parameter1.iTest_NO = listcnt; parameter1.sTest_TIME = dt.ToString("yyyy/MM/dd HH:mm:ss") await Tracsaction.Ins1Main(); } catch (Exception e) { Console.WriteLine(System.DateTime.Now + " : " + e.Message); Log.PrintOut(System.DateTime.Now + " : " + e.Message, true); } }
C#
private static bool Ins1Main() { MySqlCommand cmd = new MySqlCommand(SQL.ins1, cn); try { cmd.Parameters.Add(new MySqlParameter("i0", Program.parameter1.iTest_NO)); cmd.Parameters.Add(new MySqlParameter("s1", Program.parameter1.sTest_TIME)); cmd.Transaction = cn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); cmd.ExecuteNonQuery(); cmd.Transaction.Commit(); cmd.Connection.Close(); cmd.Dispose(); return true; } catch (Exception e) { Console.WriteLine(System.DateTime.Now + " : " + e.Message + Environment.NewLine + "Execution RollBack Start!!"); cmd.Transaction.Rollback(); return false; } }
C#
public const string ins1 = "INSERT tbl_test (Test_NO,Test_Time) VALUES(@i0,@s1)"
試したこと
Taskを使用せず同期処理に戻したりもしましたが、結果は変わりませんでした。
何らかのバッファが溜まってるのか、コネクションプール等も関係しているのかと思いましたが、改善点が分からなかったのでここで質問させていただきました。
よろしくお願いいたします。
補足情報
windows10
mysql5.6.20
上記のソースから指摘されたところを変更したソース
ひとまずcatchは省いています。以下はINSERTのみですが、UPDATEも同じように直しました。
C#
private static async Task<bool> ExitPrintImageMain() { try { int listcnt = 0; foreach (var v in TestList) { await UpdTest1TransactionAsync(listcnt); await InsTest1TransactionAsync(listcnt); listcnt = listcnt + 1; } return true; } }
parameter2~5は省いています。実際はちゃんと記述してます。
C#
private static async Task InsTest1TransactionAsync(int listcnt) { try { DateTime dt = DateTime.Now; parameter1.iTest_NO = listcnt; parameter1.sTest_TIME = dt.ToString("yyyy/MM/dd HH:mm:ss") ・ ・ ・ parameter6.iTest_NO = listcnt; parameter6.sTest_TIME = dt.ToString("yyyy/MM/dd HH:mm:ss") await Tracsaction.Ins1Main(); } }
C#
private static bool Ins1Main() { MySqlCommand cmd = new MySqlCommand(SQL.ins1, cn); try { cmd.Parameters1.Add(new MySqlParameter("i0", Program.parameter1.iTest_NO)); cmd.Parameters1.Add(new MySqlParameter("s1", Program.parameter1.sTest_TIME)); cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); ・ ・ ・ cmd = new MySqlCommand(SQL.ins6, cn); cmd.Parameters6.Add(new MySqlParameter("i0", Program.parameter6.iTest_NO)); cmd.Parameters6.Add(new MySqlParameter("s1", Program.parameter6.sTest_TIME)); cmd.ExecuteNonQuery(); cmd.Parameters.Clear(); cmd.Transaction = cn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); cmd.Transaction.Commit(); cmd.Connection.Close(); cmd.Dispose(); return true; } }
まだ回答がついていません
会員登録して回答してみよう