2011-01-15 9 views
0

Ich möchte nur eine Meinung über die ordnungsgemäße Verwendung oder ein richtiges Design in Bezug auf die Verwendung von SqlConnection-Objekt. Welche der folgenden 2 ist die beste Verwendung:Korrekte Verwendung von SqlConnection in .NET

Eine Datenprovider-Klasse, deren Methoden (jede davon) SqlConnection-Objekt enthalten (und wenn erledigt). Wie:

IList<Employee> GetAllEmployees() 
{ 
    using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
    // Code goes here... 
    } 
} 

Employee GetEmployee(int id) 
{ 
    using (SqlConnection connection = new SqlConnection(this.connectionString)) { 
    // Code goes here... 
    } 
} 

oder

SqlConnection connection; // initialized in constructor 
IList<Employee> GetAllEmployees() 
{ 
    this.TryOpenConnection(); // tries to open member SqlConnection instance 
    // Code goes here... 
    this.CloseConnection(); 
    // return 
} 

Employee GetEmployee(int id) 
{ 
    this.TryOpenConnection(); // tries to open member SqlConnection instance 
    // Code goes here... 
    this.CloseConnection(); 
    // return 
} 

Oder gibt es eine bessere Lösung als das? Ich habe einen fokussierten Web-Crawler-Anwendungstyp und diese Anwendung crawlt 50 oder mehr Websites gleichzeitig (Multithread) mit jeder Website, die in einem Crawlerobjekt enthalten ist, und jedes Crawlerobjekt hat eine Instanz einer Datenproviderklasse (oben).

+1

BTW, das hat nichts mit C# zu tun. 'SqlConnection' ist Teil von .NET, nicht Teil von C# –

+0

Richtig, ich dachte, C# wird andere wissen lassen, dass mein Codebeispiel in C# ist. Wie auch immer, danke. – Jojo

+0

, dafür steht das C# -Tag. Außerdem kann jeder, der sich den Code ansieht, sehen, dass es C# ist. –

Antwort

5

Die tatsächlichen Datenbankverbindungen werden gepoolt. Solange alle Ihre SqlConnection Instanzen die gleiche Verbindungszeichenfolge verwenden, verwenden sie alle dieselbe Verbindung.

Ich finde es sauberer, die Verbindungsinstanz zu erstellen, zu verwenden und dann zu entsorgen (in einem using Block). Auf diese Weise, wenn der Code geändert werden muss, um eine andere Verbindungszeichenfolge zu verwenden, um eine Transaktion zu verwenden, oder was auch immer, haben Sie alles, was Sie brauchen, um die Änderung direkt dort verfügbar zu machen.

+0

Ich dachte nur, dass, wenn mehr als 100 Websites gecrawlt werden und auf die Datenbank zugreifen (dies ist nur eine einzelne Datenbank, aber jede Website ist mit einer einzigen Tabelle verbunden), mehr als 100 Verbindungen möglich gemacht werden (und war es 100 ist die Standard einer Poolgröße?). Hey, warum bin ich faul :(. – Jojo

+0

@Jojo: Es wird nicht 100 Verbindungen, nur 100 SqlConnection-Instanzen. Es wird wahrscheinlich nur eine einzige Verbindung sein. Außerdem ist der beste Weg, dies zu tun, um den Code zuerst arbeiten zu lassen , und optimieren Sie Sekunde. –

0

Vielleicht nicht wirklich verwandt, aber die einzige Zeit, die ich jedes Verbindungsobjekt auf die Klasseninstanz Ebene trennen würde, wenn ich eine klare Trennung der Sorge zu machen, was jede Methode macht ... Vielleicht ist es zu lang und müssen in mehrere Teile neu strukturiert werden und jeder von ihnen muss auf der gleichen Verbindung als Teil einer Transaktion operieren.

I.e.

Create a connection 
Start transaction 
Call a subroutine to update an order header (passing along the connection or get it from the instance) 
Call a subroutine to update all order details (passing along the conneciton or get it from the instance) 
End transaction 
Close connection 

Ansonsten würde ich ziemlich Stick Option 1. W/Verbindung im Grunde ist es die Bündelung werden Sie nichts kosten.