2010-02-05 9 views
6

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?

Odpowiedz

1

Trzeba będzie zarządzać dostępem nici do członków instancji, ale większość ADO implementacje zarządzania własną puli połączeń. Generalnie oczekują, że wiele zapytań będzie uruchamianych jednocześnie.

Mogę swobodnie otwierać i zamykać tyle połączeń, ile jest konieczne, i obsługiwać wyjątki, które mogą być zgłaszane, jeśli łączenie nie było dostępne.

Oto artykuł na temat: ADO connection pooling

+0

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

+0

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

1

Jeśli utworzysz połączenie w jednym wątku, nie powinieneś używać go w innym wątku. To samo dotyczy poleceń.

Możesz jednak utworzyć połączenie na każdym z wątków i bezpiecznie używać tych obiektów w swoim własnym wątku.

Łączenie jest przydatne, gdy tworzy się wiele krótkotrwałych obiektów połączeniowych. Oznacza to, że podstawowe (kosztowne) połączenia z bazą danych są ponownie wykorzystywane.

Nick

+1

Cześć Nick, dziękuję za odpowiedź. Czy masz odwołanie do dokumentacji, która mówi: "Jeśli utworzysz połączenie/polecenie w jednym wątku, nie powinieneś używać go w innym wątku."? Nie mogłem znaleźć żadnych informacji na ten temat na MSDN. –

+2

Możesz użyć członków instancji połączeń i poleceń na wielu wątkach, upewnij się tylko, że masz tylko jeden wątek UŻYWAJĄC połączenia/polecenia w dowolnym momencie. – scottm

Powiązane problemy