2011-07-28 58 views
2

我正在托管使用mysql连接器的WCF服务。由于某种原因,每5-10分钟一次,我收到一个错误,说明mysql已经在使用中。我该怎么办?设置它以阻止它,让它为每个线程创建一个新的连接,或设置一个管理器创建一组连接并阻塞,直到连接变为可用。实际上,异步调用已经完成了最后一部分?最后最好的方法来阻止,直到另一个线程完成并从该线程获取信息?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

每当你需要简单地查询您的SQL服务器:

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为您管理和让你不连接池没有任何创建多个连接的风险可能会减慢速度。此外,这段代码是完全可重入的,因此根据定义,线程安全=>可以根据需要从多个线程同时执行。

+0

我不认为创建连接查询是一个好主意。 – Will

+2

@高,这不会为每个请求创建一个连接。它从ADO.NET为您管理的连接池中抽取一个。在using语句结束时,这个连接会简单地返回到连接池,以便它可以重用。就性能而言,这将是最快的方式。阅读以下主题以获取有关连接池的更多信息:http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-connection-pooling.html –

+0

啊,谢谢你提供的信息。不知道连接器是如何工作的。 – Will