2014-02-12 8 views
7

Ich habe auf Google nach meinem Problem gesucht, aber ich habe keine Lösung gefunden.SqlConnection Thread-Safe?

Ich habe eine Log-Klasse, die Protokolle in Windows-Journal und in einer SQL-Tabelle legte. Um meinen Code zu optimieren, möchte ich nur eine SqlConnection verwenden.

In MSDN hieß es: Alle öffentlichen statischen (Shared in Visual Basic) Mitglieder dieses Typs sind threadsicher. Es ist nicht garantiert, dass alle Instanzmitglieder Thread-sicher sind.

Meine Frage ist:

private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 

ist es Thread-sicher? Wenn ja, wenn Sie Open() und Close() verwenden?

Wenn nein, wie richtig SqlConnection verwenden?

Hier ist mein voller Klassencode:

private static readonly SqlConnection conn = new SqlConnection(ConfigParameters.Instance.UIDConnection); 

public static long WriteLog(string sSource, string sMessage, int iErrorCode, EventLogEntryType xErrorType) 
{ 
    // Windows Logs 
    if (ConfigParameters.Instance.WindowsLog) 
     EventLog.WriteEntry(sSource, sMessage, xErrorType, iErrorCode); 

    // SQL Logs 
    // TODO 

    return 0; 
} 

Vielen Dank im Voraus :)

+0

ich dies gefunden: http: // www. codeproject.com/Articles/62249/Connection-Pooling-in-multithreaded-applications Kann es eine Lösung sein? – BaptX

+1

Warum möchten Sie nur eine Verbindung verwenden? Das erhöht den Overhead, um Threading-Probleme zu vermeiden. ADO.NET verfügt bereits über ein integriertes Verbindungspooling, und Sie können den Zeitaufwand für die Verwendung einer Verbindung minimieren, indem Sie sie in eine 'using'-Anweisung einfügen. – Tim

+0

Dies hat auch nichts mit WCF zu tun, daher können Sie dieses Tag entfernen. – Tim

Antwort

12

Es ist kein gemeinsamer Weg ein SqlConnection zu teilen, und es sollte nur unter besonderen verwendet Fälle verwendet werden.

Zuerst Sie wahr, dass Ressourcenpooling ein gemeinsames Muster, wenn sie mit Steckdosen, Netzwerk-Streams, Web Services ...

Aber vor allem für SqlConnection, müssen Sie nicht kümmern arbeiten zur Verbesserung der Leistung verwendet wird, darüber, weil das Framework dies bereits für Sie tun, dank Sql Connection Pool.

Wenn ein Benutzer bei einer Verbindung den Befehl Öffnen aufruft, sucht der Pooler nach einer verfügbaren Verbindung im Pool. Wenn eine gepoolte Verbindung verfügbar ist, gibt sie diese an den Anrufer zurück, anstatt eine neue Verbindung zu öffnen. Wenn die Anwendung die Verbindung bei der Verbindung aufruft, gibt der Pooler sie an den Pool der aktiven Verbindungen zurück, anstatt sie zu schließen. Sobald die Verbindung an den Pool zurückgegeben wird, ist es bereit, auf wiederverwendet wird der nächste Open-Aufruf

Sie SqlConnection als Wrapper um wirkliche Verbindung betrachten kann. Glauben Sie nicht, dass die Einführung einer neuen SqlConnection kostspielig ist: Es ist nicht so, und viele Websites mit hohem Traffic werden damit gebaut.

Die Standardstrategie (für mindestens sql-Server) ist, dass es einfach automatisch funktioniert. Sie müssen nur darauf achten, Ihre Verbindung zu schließen (mit einem Verwendungsblock). Es gibt auch viele Einstellungen, um den Pool zu verwalten.

Du Code enthält auch ein falsches Fehlermanagement: Wenn die Verbindung abgebrochen wird (DBA, Netzwerkausfall, ...) Sie werden Ausnahmen werfen bei der Anmeldung ... nicht ideal

Zu diesem Zweck I don‘ Ich denke, dass das Teilen einer SQL-Verbindung in Ihrem Fall angemessen ist. Mit einer asynchronen Protokollierungsbibliothek erhalten Sie viel mehr Leistung.

Konzentrieren Sie sich jetzt nicht darauf, bis Sie sicher sind, dass es ein echtes Problem ist.

Wir sollten über kleine Effizienz, sagen wir etwa 97% der Zeit vergessen: vorzeitige Optimierung ist die Wurzel allen Übels, Donald Knuth

+0

Ich habe die SqlConnection in der Methode :) – BaptX