Dwie aplikacje wyczerpują connection pools i generują connection timeouts.

Dwie aplikacje wyczerpują connection pools i generują connection timeouts.
EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
0

Mam dwie aplikacje:

  1. Client wykorzystujący WebSerwis do odpytywania bazy danych. Połączenia odbywają się za pośrednictwem SqlConnect (integratedSecurity). Każde odpytanie to nowe połączenie.
    Connection String dla webSerwisu:
Kopiuj
Data Source=database;Initial Catalog=data_TEST;Integrated Security=SSPI;MultipleActiveResultSets=true;
  1. Wokrery, łączące się z bazą za pośrednictwem nHibernate.
    Connection String dla workera:
Kopiuj
Data Source=database;Initial Catalog=data_TEST;Integrated Security=SSPI;MultipleActiveResultSets=true;

W momencie, w którym worker, który ma większe zadanie na bazie(Prawdopodobnie ponad 1000 zapytań), aplikacja kliencka nie może nawiązać połączenia z bazą danych i webSerwis generuje błąd: connection timeout.

Próbowałem ustawić min pool (np 20), aby klient miał zawsze możliwość połączenia. Zwiększałem też ilość połączeń. Niestety w miarę zadowalające efekty miałem przy liczbie 2000 max connection pool dla workera a i tak nie zawsze wszystko działa poprawnie.

Aplikacje są na innym serwerze niż baza MsSql.

Co można zrobić pod względem optymalizacji aby mieć pewnosć, że web serwis zawsze się połączy?

edytowany 2x, ostatnio: EroSanin
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2153
0

Rozumiem, że dla każdego zapytania otwierasz nowe połączenie. Nie da się tego zrobić z jednym połączeniem i lecieć te 1000 zapytań?

EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
0

Stara aplikacja, a workery są niby oddzielnymi aplikacjami ale łączą się z serwisami gdzie są definiowane a następnie są podłączane pod silnik nHibernate, gdzie za pomocą serwisów odwala się cały koncert. Przeróbka bebechów byłaby bardzo kosztowna...

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2153
0

Czyli w kodzie odpada, a connection string można zmienić? Masz jakiś config?
Można spróbować dopisać do connection string

Kopiuj
Pooling=false;
EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
0

Tak, ConnectionStringi jak najbardziej mogę zmienić. Mógłbyś mi wytłumaczyć czemu wyłączenie poolingu mogłoby pomóc?

AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2153
0

Wychodzi na to, że w twoim przypadku nie jest tak jak powinno być w kwestii connection stringa. Jeśli connection string jest taki sam to za każdym razem jest wyciągana pula już istniejąca, nie tworzy się nowa. Widzę, że u ciebie connection stringi są te same więc jeśli wyłączysz pooling, a błąd wciąż będzie się pojawiał to problem jest kompletnie w czymś innym.

EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
0

Wyłączyłem pooling w webServisie, błąd nadal się pojawia.

A to przypadkiem nie jest tak, że każda aplikacja ma swój pooling? Znaczy nawet jesli mają identyczne ConnectionStringi to nie mają po 100 connection pools?

Swoją droga worker potrafi wygenerować ponad 50 sesji w ciągu 2 minut. Nie jestem do końca pewien jak liczyć zajęcie pooli w tym wypadku. Można to jakoś realnie sprawdzić na bazie lub przy timeoucie z poziomu c#?

edytowany 1x, ostatnio: EroSanin
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2153
0

Nie za bardzo mam jak sprawdzić to zapytanie ale podobno wyciąga connection pool count:

Kopiuj
SELECT COUNT(*)FROM(SELECT host_process_id FROM sys.dm_exec_sessions WHERE PROGRAM_NAME = 'MyApplicationName' GROUP BY host_process_id) AS A
EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
0

Znam to zapytanie. Pokazuje mi jedno połczenie. Sprawdzałem w trakcie pracy workera. Wydaje mi się, że wtedy powinny być przynajmniej dwa połączenia. Workera i moje poprzez MenagmentStudio.

Możliwe, że nie mam wystarczających uprawnień.

edytowany 2x, ostatnio: EroSanin
AdamWox
  • Rejestracja:ponad 7 lat
  • Ostatnio:około 8 godzin
  • Lokalizacja:Jastrzębie-Zdrój
  • Postów:2153
0

No to wszystko wskazuje na to, że problem nie leży po stronie przepełnionej puli, a bardziej czasu połączenia lub dostępu do serwera SQL. Skoro nie ma opcji zajrzeć i poprawić w kodzie to trzeba sprawdzić czy ci się połączenie nie traci. Pisałeś, że aplikacje są na innej maszynie niż serwer. Czy to znaczy, że wszystkie zapytania lecą po LAN? Nie jestem pewien czy to da jakieś wiarygodne wyniki ale spróbuj puścić ping na serwer i zobacz czy pakiety się nie tracą.
PS.
Ja mam aplikację, która robi backup baz SQL i spotkałem się tylko raz z timeoutem. Nie miałem możliwości znalezienia przyczyny ale co dziwne aplikacja sypała timeoutem uruchomiona na tej samej maszynie co baza danych. Czasem się zastanawiam czy to ja już programować nie potrafię czy po prostu ten jest jakiś super wyjątkiem bo u pozostałych 20 klientów (czasem po 200 baz na jednej instacji) leci bez zająknięcia.

PA
  • Rejestracja:ponad 22 lata
  • Ostatnio:około 4 godziny
  • Postów:3866
0

SSMS ma inny program name, wiec dlatego go nie widzisz w wyniku zapytania, pytanie czy masz możliwość puszczenia zapytan, na bazie podczas gdy workery rzucają timeout-y? Co możesz podejrzeć sprawdzić na serwerze DB?

SL
  • Rejestracja:ponad 19 lat
  • Ostatnio:ponad 6 lat
  • Lokalizacja:Bydgoszcz
0

A możesz żonglować użytkownikami do połączenia ? Można wymusić priorytet dla użytkowników za pomocą Resource Governor, może to wystarczy.


Bydgoszcz, Senior .Net Developer
EroSanin
  • Rejestracja:ponad 10 lat
  • Ostatnio:około 7 lat
  • Postów:311
0
Panczo napisał(a):

SSMS ma inny program name, wiec dlatego go nie widzisz w wyniku zapytania, pytanie czy masz możliwość puszczenia zapytan, na bazie podczas gdy workery rzucają timeout-y? Co możesz podejrzeć sprawdzić na serwerze DB?

Nie mam pełnych uprawnień na serwerze. Zewnętrzna firma. Podejrzewam, że dlatego.

Slepiec napisał(a):

A możesz żonglować użytkownikami do połączenia ? Można wymusić priorytet dla użytkowników za pomocą Resource Governor, może to wystarczy.

Integrated Security=SSPI -- to nie jest równoznaczne z tym, że obie aplikacje jadą na tym samym użytkowniku?

Sprawdziłem za pomoca PerformanceMonitora jak wyglada obciażenie ConnectionPools i ConnectionPoolGroup. Wszystko poniżej 10 na wykresie. Zaś głowny wykres z Procesor Time'em lata jak szalony koło 80-90. Odpaliłem aplikację testującą w czasie działania workera i ProcesorTime osiągnął nawet 100 na pare sekund. Moge odważnie założyć, że procesor nie wyrabia i stąd zerwane połączenia?

SL
Chodziło mi o to żeby odpalić to na dwóch różnych użytkownikach, nawet windowsowych. Pewnie dodania usera też nie dali uprawnień?
EroSanin
No nie. Mam jednego usera, na którym mogę się łączyć apką i pracować...
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)