2012-07-12 12 views
7

Która z poniższych dwóch metod zapewnia lepszą wydajność?Usuń połączenie lub Zamknij połączenie

using(var DB_Connection_s = new DBConnection()) 
{ 
//todo: interact with database connection 
} 

lub po prostu:

DB_Connection_s.Close(); 

na końcu.

Czy pierwsza metoda sprawia, że ​​koncepcja łączenia jest bezużyteczna? Ponieważ jeśli wyrzucę połączenie przy każdym użyciu, muszę za każdym razem otworzyć nowe połączenie (i nie będzie żadnych połączeń w puli).

+0

Usuwanie spowoduje zamknięcie, a także oczyszczenie wszystkich innych zasobów. – Oded

+1

Wiem, pytam, czy ten performance jest mądry, by zabić połączenie za każdym razem, a następnie jakie korzyści płyną z huku ?! –

+0

ponieważ wiem, kiedy po prostu zamykam połączenie .it pozostaje w puli i używane, jeśli nie był aktywny. –

Odpowiedz

5

Połączenia są uwalniane z powrotem do basenu kiedy zadzwonić Close lub zbywać na połączenia ...

source = SQL Server Connection Pooling (ADO.NET)

Więc usunąć martwić się o utratę wydajności spowodowanych brakowało łączono znajomości.
Z punktu widzenia kodu różnica powinna być tak minimalna, że ​​oświadczenie using należy zawsze stosować

+0

hmmm, czy to oznacza, że ​​jeśli wyrzucę połączenie, pozostanie ono w puli.Tak jaka jest główna różnica między Close() & Dispose() .Jeśli oba z nich zwrócą połączenie z powrotem do puli. –

+0

Ten artykuł na [MSDN] (http://social.msdn.microsoft.com/Forums/en/netfxbcl/thread/f7d1fc91-2829-4835-9021-63b7353dd481) omawia różnicę między tymi dwoma metodami. Przeczytaj odpowiedź z 'BinaryCoder' – Steve

1

Użyj utylizacji. Wewnętrznie w Dispose zamknie to połączenie, więc nie musisz się martwić, można to łatwo sprawdzić z Reflectorem lub podobnym, jeśli masz wątpliwości.

Jeśli chodzi o wydajność, nadal chciałbym iść z użyciem. System Windows ma włączone różne pamięci podręczne (oczywiście w ODBC), aby zapewnić ponowne użycie wielokrotnych żądań dla tego samego połączenia i dlatego nie należy się martwić o wydajność.

+0

Wiem, pytam, czy ten performance jest mądry, by zabić połączenie za każdym razem, a następnie jakie korzyści płyną z huku ?! –

+0

Niestety - moje złe, aktualizując moją odpowiedź – Ian

7

Wzorzec using jest lepszy, ponieważ wywołanie Dispose ostatecznie zamyka połączenie, ale jako bonus połączenie jest zamykane, nawet jeśli coś w użytkowaniu idzie nie tak. Na przykład wyjątek lub po prostu powrót, który wymusza wykonanie programu z zakresu używania. Przy użyciu nie trzeba jawnie zamykać połączenia, co sprawia, że ​​kod jest bardziej czytelny. Jako inny wzór połączenie musi zostać zamknięte tak szybko, jak to możliwe. Podczas zamykania/otwierania połączenia zbyt często nie występują żadne problemy z wydajnością, ponieważ pula połączeń zoptymalizuje ponowne użycie połączenia.

+0

hmmm, czy to oznacza, że ​​jeśli wyrzucę połączenie, pozostanie ono w puli. –

+1

@just_name, tak zamykanie i utylizacja nie robi różnicy: zamknięte połączenie jest po prostu ponownie połączone z pulą –

+0

, a rozłączone połączenie jest również uwalniane do puli. Mam rację? –

1

Chyba że masz zamiar zadzwonić .Open() znowu niedługo,

użyć bloku using(){}.

jeśli zamierzasz korzystać z tego samego połączenia gdzieś indziej wkrótce
wezwanie .close(); następnie .open() i tak dalej ...
utrzymać klasa wdrożenia IDisposable i wrzucać tam połączenia!

nadal trwa tworzenie obiektu połączenia

Powiązane problemy