Cel
Za pomocą ADO.NET IDbConnection i IDbCommand wykonać wiele poleceń jednocześnie, przeciwko tej samej bazy danych, biorąc pod uwagę, że realizacja ADO.NET jest określony w czasie wykonywania.Jak bezpiecznie używać ADO.NET IDbConnection i IDbCommand do równoczesnego wykonywania wielu poleceń bazy danych?
Investigation
MSDN Dokumentacja IDbConnection
nie określa żadnych ograniczeń gwintowania. Strona SqlConnection
zawiera standardowe zastrzeżenie: "Żadne elementy instancji nie mogą być bezpieczne dla wątków." "Dokumentacja IDbCommand
i SqlCommand
jest równie nieinformatywna.
Zakładając, że żaden pojedynczy element instancji nie jest bezpieczny dla wątków, nadal mogę tworzyć wiele poleceń z połączenia (w tym samym wątku), a następnie wykonywać je jednocześnie w różnych wątkach.
Prawdopodobnie nie przyniesie to pożądanego skutku, ponieważ (zakładam) tylko jedno polecenie może być wykonywane jednocześnie na pojedynczym bazowym połączeniu z bazą danych. Tak więc jednoczesne wykonywanie egzekucji IDbCommand
zostanie przekształcone do postaci szeregowej podczas połączenia.
Wnioski
Więc to oznacza, że musimy utworzyć oddzielną IDbConnection
, który jest ok, jeśli wiesz, że używasz SqlConnection
ponieważ obsługuje buforowanie. Jeśli twoja implementacja ADO.NET jest określona w czasie wykonywania, to założenia nie mogą być wykonane.
Czy to oznacza, że muszę wdrożyć własne buforowanie połączeń w celu obsługi wydajnego, wielowątkowego dostępu do bazy danych?
Jaki wyjątek zostanie zgłoszony, jeśli łączenie jest niedostępne?Czy istnieje standardowy wyjątek zdefiniowany w tym celu, który byłby konsekwentnie stosowany przez różnych dostawców ADO.NET? –
Cóż, teraz jestem przekonany, że jeśli używasz ADO, będzie dostępne łączenie. Nie jestem pewien, jaki wyjątek zostałby zgłoszony, ale prawdopodobnie byłbyś bezpieczny, zakładając, że dostępne jest łączenie i przechwytywanie wszystkich wystąpień wyjątku dla jakichkolwiek przypadków krawędziowych. – scottm