2011-07-28 8 views
2

私はmysqlコネクタを使用するWCFサービスをホストしています。なんらかの理由で、5〜10分に1回、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があなたのために管理しますので、「ドンという接続プールに戻されることを保証します物事を遅くする可能性のある複数の接続を作成するリスクはありません。また、このコードは完全にリエントラントなので、定義上はスレッドセーフです。>これは、あなたが望む数のスレッドから同時に実行することができます。

+0

これまでのクエリの接続を作成することはお勧めしません。 – Will

+2

@High、これはリクエストごとに接続を作成しません。 ADO.NETが管理する接続プールから1つを取り出します。そしてusingステートメントの終わりに、この接続は接続プールに戻され、再利用できるようになります。パフォーマンスの面では、可能な限り最速の方法です。接続プーリングの詳細については、次のトピックを参照してください。http://dev.mysql.com/doc/refman/5.0/en/connector-net-programming-connection-pooling.html –

+0

ああ、情報をありがとう。コネクターがそのように働いているという考えはありませんでした。 – Will

関連する問題