2011-07-28 6 views
2

mysql 커넥터를 사용하는 WCF 서비스를 호스팅하고 있습니다. 웬일인지 매 5 ~ 10 분마다 한 번씩 mysql이 이미 사용 중이다. 어떻게해야합니까? 그것을 차단하도록 설정하여 스레드마다 새 연결을 만들거나 설정된 수의 연결을 만드는 관리자를 설정하고 연결이 가능해질 때까지 차단합니다. 실제로 비동기 호출이 이미 마지막 부분을 수행합니까? 마지막으로 다른 스레드가 완료되고 그 스레드에서 정보를 얻을 때까지 차단하는 가장 좋은 방법은 무엇입니까? 당신은 단순히 당신의 SQL 서버를 쿼리 할 필요가C# Mysql 및 여러 스레드?

public static int Query(this IDbConnection olddb, string query, params object[] args) 
{ 
    using (var db = olddb.CloneEx()) 
    { 
     db.Open(); 
     using (var com = db.CreateCommand()) 
     { 
      com.CommandText = query; 
      for (int i = 0; i < args.Length; i++) 
       com.AddParameter("@" + i, args[i]); 

      return com.ExecuteNonQuery(); 
     } 
    } 
} 
Unhandled Exception: System.NotImplementedException: The requested feature is not implemented. 
    at MySql.Data.MySqlClient.MySqlConnection.EnlistTransaction (System.Transactions.Transaction transaction) [0x00000] in :0 
    at MySql.Data.MySqlClient.MySqlConnection.Open() [0x00000] in :0

답변

10

매번 :

using (var conn = new MySqlConnection("Some connection string")) 
using (var cmd = conn.CreateCommand()) 
{ 
    conn.Open(); 
    cmd.CommandText = "SELECT foo FROM bar"; 
    using (var reader = cmd.ExecuteReader()) 
    { 
     while (reader.Read()) 
     { 
      // process the results 
     } 
    } 
} 

이 연결이 ADO.NET 당신을 위해 관리하고 그래서 당신은 '돈되는 연결 풀에 반환되는 것을 보장 일을 늦출 수있는 다중 연결을 만들지 못할 위험이 있습니다. 또한이 코드는 완벽하게 재진입 성이므로 정의에 의해 thread safe => 원하는만큼 많은 스레드에서 동시에 실행될 수 있습니다.

+0

나는 항상 쿼리를위한 연결을 만드는 것이 좋은 생각이라고 생각하지 않습니다. – Will

+2

@High, 모든 요청에 ​​대해 연결을 생성하지 않습니다. ADO.NET이 관리하는 연결 풀에서 하나를 가져옵니다. 그리고 using 문이 끝날 때이 연결은 연결 풀로 반환되어 다시 사용할 수 있습니다. 성능면에서 가장 빠른 방법이 될 것입니다. 연결 풀링에 대한 자세한 내용은 다음 항목을 참조하십시오. http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-connection-pooling.html –

+0

아, 정보 주셔서 감사합니다. 커넥터가 그런 식으로 작동하지 않았다. – Will