Database
 sql >> Baza danych >  >> RDS >> Database

Znajdź wycieki połączeń z bazą danych w swojej aplikacji

Gość Autor:Michael J Swart (@MJSwart)

Ostatnio zaskoczyło nas kilka wyjątków, które zgłosiła nasza aplikacja. Nasza aplikacja nie działała podczas próby otwarcia połączenia SqlConnection. Wyjątki wyglądały tak:

Błąd System.InvalidOperationException:

Limit czasu upłynął. Limit czasu upłynął przed uzyskaniem połączenia z puli. Mogło to nastąpić, ponieważ wszystkie połączenia w puli były używane i osiągnięto maksymalny rozmiar puli.

Pule połączeń

Pamiętaj, że .Net używa pul połączeń, aby uniknąć narzutu związanego z nawiązywaniem połączenia przy każdym zapytaniu. Pule połączeń są utrzymywane dla każdego ciągu połączenia i domyślnie liczba połączeń w puli jest ograniczona do stu. Zwykle wystarczy sto połączeń. Nigdy wcześniej nie mieliśmy problemu z tym wyjątkiem, a nasze serwery nie były bardziej zajęte niż zwykle, więc wahaliśmy się, czy zwiększyć wartość MaxPoolSize. Zaczęliśmy podejrzewać wycieki połączeń z bazą danych.
 

Wycieki połączenia z bazą danych

Podobnie jak w przypadku przecieków pamięci, przecieki połączeń z bazą danych mogą wystąpić, jeśli nie pozbędziesz się połączeń z bazą danych w odpowiednim czasie. SqlConnections są IDisposable, więc najlepiej jest użyć instrukcji using:

używanie (SqlConnection conn =new SqlConnection(connectionString)) { conn.Open(); // itd...}

Gdy tylko skończysz z SqlConnection, zostanie ono usunięte, a rzeczywiste połączenie natychmiast wraca do puli połączeń, aby mogło być używane przez kogoś innego. W przeciwnym razie połączenie pozostanie w użyciu do momentu zakończenia procesu lub wyczyszczenia go przez usuwanie śmieci.

Znajdowanie wycieków połączenia

Tak więc, jeśli w aplikacji występują przekroczenia limitu czasu połączenia z powodu wycieku połączenia z bazą danych, ślady stosu mogą nie pomóc. Podobnie jak w przypadku wyjątku braku pamięci z powodu wycieku pamięci, ślad stosu zawiera informacje o ofierze, ale nie o głównej przyczynie. Gdzie więc możesz znaleźć wyciek?
 
Mimo że wycieki połączeń z bazą danych są problemem klienta, możesz znaleźć pomoc na serwerze bazy danych. Na serwerze bazy danych spójrz na połączenia na proces na bazę danych, aby uzyskać przybliżone oszacowanie rozmiaru każdej puli:

 wybierz count(*) jako sesje, s.host_name, s.host_process_id, s.program_name, db_name(s.database_id) jako database_name z sys.dm_exec_sessions s gdzie is_user_process =1 group by host_name, host_process_id, program_name, database_id order według count(*) opis;

Nazwa programu, nazwa hosta, identyfikator procesu i nazwa bazy danych są zwykle wystarczająco dobre, aby zidentyfikować połączenia pochodzące z tej samej puli połączeń.

To prowadzi mnie do zadania kilku dodatkowych pytań dotyczących puli z wieloma połączeniami. Biorąc pod uwagę pulę, czy istnieją sesje, które były uśpione przez jakiś czas, a jeśli tak, to jak długo spały i jaka była ostatnia wykonana przez nich instrukcja SQL?

deklaruj @host_process_id int =1508; zadeklaruj @ nazwa_hosta nazwa_systemu =N'SERV4102'; zadeklaruj @database_name sysname =N'My_Database'; wybierz datediff(minute, s.last_request_end_time, getdate()) jako minutes_asleep, s.session_id, db_name(s.database_id) jako database_name, s.host_name, s.host_process_id, t.text jako last_sql, s.program_name z exec_connections c dołącz do sys.dm_exec_sessions s na c.session_id =s.session_id zastosuj krzyżowo sys.dm_exec_sql_text(c.most_recent_sql_handle) t gdzie s.is_user_process =1 i s.status ='sleeping' i @data_name(s) s.host_process_id =@host_process_id and s.host_name =@host_name i datediff(second, s.last_request_end_time, getdate())> 60 kolejność według s.last_request_end_time;

Tekst może być teraz używany do przeszukiwania bazy kodu aplikacji w celu znalezienia miejsca, w którym może wystąpić przeciek połączenia z bazą danych.

Te zapytania są przydatne do rozwiązywania problemów z wyciekiem połączenia z bazą danych i mogą być również używane do tworzenia monitora lub kontroli kondycji.

Wyrzuć swoje artykuły jednorazowego użytku, użyj tych, które są używane, uszczelnij te wycieki!

O autorze

Michael J Swart jest pasjonatem baz danych i blogerem, który koncentruje się na tworzeniu baz danych i architekturze oprogramowania. Lubi mówić o wszystkim, co dotyczy danych, przyczyniając się do projektów społecznościowych. Michael pisze bloga jako „Zaklinacz bazy danych” na michaeljswart.com.
  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Używanie tabel JavaFX do organizowania danych

  2. Rozwiązania czytelników do wyzwania Specjalne Wyspy

  3. Modele danych

  4. Zabezpiecz swoje klastry Mongo za pomocą SSL

  5. Operator SQL EXISTS dla początkujących