2014-12-11 8 views
1

내 코드에 문제가 있습니다. 프로세스를 가속화하기 위해 작업을 사용하는 MySQL 데이터베이스 테이블에 약 100.000 개의 항목을 삽입하려고합니다. 난 내 코드를 실행하면작업으로 MySQL에 100.000 항목 삽입 - C#

List <Task> tasks = new List <Task>(); 
int counter = 0; 
foreach(var folder in dirs) { 
    object lockTarget = new object(); 

    tasks.Add(Task.Factory.StartNew(() => { 
     try { 
       comm.CommandText = "INSERT INTO webdata(url,title) VALUES(?sUrl,?sTitle,) ON DUPLICATE KEY UPDATE url=?sUrl,title=?sTitle"; 
       comm.Parameters.Add("?sUrl", MySql.Data.MySqlClient.MySqlDbType.VarChar).Value = url; 
       comm.Parameters.Add("?sTitle", MySql.Data.MySqlClient.MySqlDbType.VarChar).Value = title; 

       var mysql_return = comm.ExecuteNonQueryAsync(); 

       lock(lockTarget) { 
        counter++; 
        Console.WriteLine("\rProcessing {0} of {1} - {2} {3}", counter, dirs.Length, folder, mysql_return.Status); 
       } 

     } catch (MySql.Data.MySqlClient.MySqlException ex) { 
      Console.WriteLine(ex.Message); 
     }  
    })); 
} 

Task.Factory.StartNew(() => { 
    Task.WaitAll(tasks.ToArray()); 
    Console.WriteLine("Finished"); 
    conn.Close(); 
}); 

그래서, 작업 (mysql_return)의 일부는 따라서 단지 1/2 내 항목이 실제로 DB에 삽입 rantocompletion 일부 Faulted를 반환하는 : 여기 내 코드입니다.

ExecuteNonQueryTask을 사용할 수 있지만 너무 많은 데이터를 삽입하는 데 시간이 오래 걸릴 수 있습니다. 하드웨어 (CPU가 수천 개의 생성 된 작업을 처리하지 못함) 또는 코드 때문에 문제가 있습니까?

아이디어가 있으십니까? 미리 감사드립니다.

+2

:

그래서 당신의 코드는 다음과 같이 될 것이다? http://stackoverflow.com/questions/5526917/how-to-do-a-batch-insert-in-mysql – sed

답변

4

문제 1 : comm은 로컬 변수 여야합니다.

Problem2 : 당신은 ExecuteNonQueryAsync에 의해 반환 작업을 기다리고하지 않을 때문에 Task 완료 될 ExecuteNonQueryAsync의 완료를 기다리지 않습니다 StartNew로 돌아왔다.

결국 모든 작업이 완료되었다고 가정하고 연결을 닫습니다. 모두 시작되었지만 완료되지 않았습니다. 당신은 사용할 필요가

(즉 사용 async 람다에 대한) ExecuteNonQueryAsync의 결과를 기다리고 있으며 Task.UnWrap를 무료로 전화를 걸거나 당신에게 UnWrap을 제공 Task.Run를 사용합니다. 대신 할 수없는 이유는 그냥 삽입 배치

tasks.Add(Task.Run(async() => //Note Task.Run and async lambda 
{ 
     try 
     { 
     var comm = new WhateverCommand(); 
     ... 

     var mysql_return = await comm.ExecuteNonQueryAsync();//Note the await 
     ... 
     } 
     catch (MySql.Data.MySqlClient.MySqlException ex) 
     { 
     Console.WriteLine(ex.Message); 
     }  
})); 
+0

@ Theodoros80 그러나 성공할 수있는 두 가지 문제를 모두 해결할 때만 기억하십시오. –

+1

고마워, 한번 시도해 볼께. 어떤 것들은 내 머리에 분명합니다. – Theodoros80