4 Stimmen

C# Mysql und mehrere Threads?

Ich hoste einen WCF-Dienst, der den mysql-Connector verwendet. Aus irgendeinem Grund erhalte ich alle 5-10 Minuten eine Fehlermeldung, dass mysql bereits in Gebrauch ist. Was sollte ich tun? Richten Sie es so ein, dass es blockiert, lassen Sie es eine neue Verbindung pro Thread erstellen oder richten Sie einen Manager ein, der eine bestimmte Anzahl von Verbindungen erstellt und blockiert, bis eine Verbindung verfügbar wird. Eigentlich tun die asynchronen Aufrufe bereits den letzten Teil? Wie kann man am besten blockieren, bis ein anderer Thread abgeschlossen ist, und Informationen von diesem Thread erhalten?

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

14voto

Darin Dimitrov Punkte 990883

Jedes Mal, wenn Sie Ihren SQL-Server abfragen möchten, können Sie dies einfach tun:

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
        } 
    }
}

Dadurch wird sichergestellt, dass die Verbindungen in den Verbindungspool zurückgegeben werden, den ADO.NET für Sie verwaltet, und dass Sie nicht das Risiko eingehen, mehrere Verbindungen zu erstellen, die die Dinge verlangsamen könnten. Außerdem ist dieser Code vollkommen ablaufinvariant und somit per Definition thread-sicher => er kann von beliebig vielen Threads gleichzeitig ausgeführt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X