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?
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? –
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