2010-02-05 4 views
6

Der Tor

Verwenden Sie eine ADO.NET IDbConnection und IDbCommand mehrere Befehle gleichzeitig ausführen, gegen die gleiche Datenbank, da die ADO.NET-Implementierung zur Laufzeit angegeben wird.Wie verwende ich ADO.NET IDbConnection und IDbCommand, um mehrere Datenbankbefehle gleichzeitig auszuführen?

Investigation

Die MSDN-Dokumentation für IDbConnection keine Threading Einschränkungen angeben ist. Die SqlConnection Seite hat die Standard-Haftungsausschluss mit der Aussage "Any Instanz Mitglieder sind nicht garantiert Thread sicher sein." Die IDbCommand und SqlCommand Dokumentation ist ebenso uninformativ.

Angenommen, dass kein einzelnes Instanzmitglied threadsicher ist, kann ich immer noch mehrere Befehle von einer Verbindung (im selben Thread) erstellen und sie dann gleichzeitig auf verschiedenen Threads ausführen.

Vermutlich würde dies immer noch nicht den gewünschten Effekt erzielen, weil (ich nehme an) nur ein Befehl gleichzeitig auf der einzelnen zugrunde liegenden Verbindung zur Datenbank ausgeführt werden kann. So würden die gleichzeitigen Ausführungen IDbCommand bei der Verbindung serialisiert werden.

Fazit

Dies bedeutet also, wir eine separate IDbConnection, zu schaffen haben, die, wenn Sie in Ordnung ist wissen Sie SqlConnection verwenden, weil das Pooling unterstützt. Wenn Ihre ADO.NET-Implementierung zur Laufzeit festgelegt wird, können diese Annahmen nicht getroffen werden.

Bedeutet dies, dass ich mein eigenes Verbindungs-Pooling implementieren muss, um performanten Multithread-Zugriff auf die Datenbank zu unterstützen?

Antwort

1

Sie müssen Thread Zugriff auf Ihre Instanz Mitglieder verwalten, aber die meisten ADO-Implementierungen verwalten ihre eigenen Verbindungspool. Sie erwarten im Allgemeinen, dass mehrere Abfragen gleichzeitig ausgeführt werden.

Ich würde gerne so viele Verbindungen wie nötig öffnen und schließen und eine Ausnahme behandeln, die ausgelöst werden könnte, wenn das Pooling nicht verfügbar wäre.

Hier ist ein Artikel auf ADO connection pooling

+0

Welche Ausnahme würde ausgelöst, wenn Pooling nicht verfügbar ist?Ist für diesen Zweck eine Standardausnahme definiert, die konsistent über verschiedene ADO.NET-Provider hinweg verwendet wird? –

+0

Nun, ich bin überzeugt, dass Pooling verfügbar ist, wenn Sie ADO verwenden. Ich bin nicht sicher, welche Ausnahme ausgelöst werden würde, aber Sie könnten wahrscheinlich davon ausgehen, dass Pooling verfügbar ist und alle Exception-Instanzen für alle Edge-Fälle erfasst werden. – scottm

1

Wenn Sie eine Verbindung in einem Thread erstellen, sollten Sie sie nicht in einem anderen Thread verwenden. Das gleiche gilt für Befehle.

Sie können jedoch eine Verbindung für jeden Ihrer Threads erstellen und diese Objekte sicher für ihren eigenen Thread verwenden.

Pooling ist für, wenn Sie viele kurzlebige Verbindungsobjekte erstellen. Dies bedeutet, dass die zugrunde liegenden (teuren) Datenbankverbindungen wiederverwendet werden.

Nick

+1

Hallo Nick, danke für Ihre Antwort. Haben Sie einen Verweis auf eine Dokumentation, die besagt "Wenn Sie eine Verbindung/einen Befehl für einen Thread erstellen, sollten Sie ihn nicht für einen anderen Thread verwenden"? Ich konnte keine Informationen dazu auf MSDN finden. –

+2

Sie können Verbindungs- und Befehlsinstanzmitglieder für mehrere Threads verwenden, stellen Sie jedoch sicher, dass Sie nur einen Thread verwenden, der die Verbindung/den Befehl jederzeit verwendet. – scottm

Verwandte Themen