前提
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#
1 private static async Task<bool> ExitPrintImageMain() 2 { 3 try 4 { 5 int listcnt = 0; 6 7 foreach (var v in TestList) 8 { 9 await UpdTest1TransactionAsync(listcnt); 10 11 await InsTest1TransactionAsync(listcnt); 12 13 await InsTest2TransactionAsync(listcnt); 14 15 await InsTest3TransactionAsync(listcnt); 16 17 await UpdTest2TransactionAsync(listcnt); 18 19 await UpdTest3TransactionAsync(listcnt); 20 21 await UpdTest4TransactionAsync(listcnt); 22 23 await InsTest4TransactionAsync(listcnt); 24 25 await UpdTest4TransactionAsync(listcnt); 26 27 await InsTest5TransactionAsync(listcnt); 28 29 await InsTest6TransactionAsync(listcnt); 30 31 listcnt = listcnt + 1; 32 } 33 return true; 34 } 35 catch (Exception e) 36 { 37 Console.WriteLine(System.DateTime.Now + " : " + e.Message); 38 return false; 39 } 40 }
パラメータはもっと沢山ありますが、一部のみ記述しています。
C#
1 private static async Task InsTest1TransactionAsync(int listcnt) 2 { 3 try 4 { 5 DateTime dt = DateTime.Now; 6 7 parameter1.iTest_NO = listcnt; 8 parameter1.sTest_TIME = dt.ToString("yyyy/MM/dd HH:mm:ss") 9 10 await Tracsaction.Ins1Main(); 11 } 12 catch (Exception e) 13 { 14 Console.WriteLine(System.DateTime.Now + " : " + e.Message); 15 Log.PrintOut(System.DateTime.Now + " : " + e.Message, true); 16 } 17 } 18
C#
1 private static bool Ins1Main() 2 { 3 MySqlCommand cmd = new MySqlCommand(SQL.ins1, cn); 4 try 5 { 6 cmd.Parameters.Add(new MySqlParameter("i0", Program.parameter1.iTest_NO)); 7 cmd.Parameters.Add(new MySqlParameter("s1", Program.parameter1.sTest_TIME)); 8 9 cmd.Transaction = cn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); 10 cmd.ExecuteNonQuery(); 11 cmd.Transaction.Commit(); 12 cmd.Connection.Close(); 13 cmd.Dispose(); 14 return true; 15 } 16 catch (Exception e) 17 { 18 Console.WriteLine(System.DateTime.Now + " : " + e.Message + Environment.NewLine + "Execution RollBack Start!!"); 19 cmd.Transaction.Rollback(); 20 return false; 21 } 22 }
C#
1public const string ins1 = "INSERT tbl_test (Test_NO,Test_Time) VALUES(@i0,@s1)"
試したこと
Taskを使用せず同期処理に戻したりもしましたが、結果は変わりませんでした。
何らかのバッファが溜まってるのか、コネクションプール等も関係しているのかと思いましたが、改善点が分からなかったのでここで質問させていただきました。
よろしくお願いいたします。
補足情報
windows10
mysql5.6.20
上記のソースから指摘されたところを変更したソース
ひとまずcatchは省いています。以下はINSERTのみですが、UPDATEも同じように直しました。
C#
1private static async Task<bool> ExitPrintImageMain() 2 { 3 try 4 { 5 int listcnt = 0; 6 7 foreach (var v in TestList) 8 { 9 await UpdTest1TransactionAsync(listcnt); 10 11 await InsTest1TransactionAsync(listcnt); 12 listcnt = listcnt + 1; 13 } 14 return true; 15 } 16 }
parameter2~5は省いています。実際はちゃんと記述してます。
C#
1private static async Task InsTest1TransactionAsync(int listcnt) 2 { 3 try 4 { 5 DateTime dt = DateTime.Now; 6 7 parameter1.iTest_NO = listcnt; 8 parameter1.sTest_TIME = dt.ToString("yyyy/MM/dd HH:mm:ss") 9 ・ 10 ・ 11 ・ 12 parameter6.iTest_NO = listcnt; 13 parameter6.sTest_TIME = dt.ToString("yyyy/MM/dd HH:mm:ss") 14 15 await Tracsaction.Ins1Main(); 16 } 17 }
C#
1 private static bool Ins1Main() 2 { 3 MySqlCommand cmd = new MySqlCommand(SQL.ins1, cn); 4 try 5 { 6 cmd.Parameters1.Add(new MySqlParameter("i0", Program.parameter1.iTest_NO)); 7 cmd.Parameters1.Add(new MySqlParameter("s1", Program.parameter1.sTest_TIME)); 8 cmd.ExecuteNonQuery(); 9 cmd.Parameters.Clear(); 10 ・ 11 ・ 12 ・ 13 cmd = new MySqlCommand(SQL.ins6, cn); 14 cmd.Parameters6.Add(new MySqlParameter("i0", Program.parameter6.iTest_NO)); 15 cmd.Parameters6.Add(new MySqlParameter("s1", Program.parameter6.sTest_TIME)); 16 cmd.ExecuteNonQuery(); 17 cmd.Parameters.Clear(); 18 19 cmd.Transaction = cn.BeginTransaction(System.Data.IsolationLevel.ReadCommitted); 20 cmd.Transaction.Commit(); 21 cmd.Connection.Close(); 22 cmd.Dispose(); 23 return true; 24 } 25 }
回答2件
あなたの回答
tips
プレビュー