2011-01-08 12 views
5

Mam obecnie scenariusz, w którym 1000 działań może nastąpić w ciągu kilku sekund i muszę przechowywać wszystkie te działania w bazie danych.Jak skutecznie logować 100s do 1000s działań do bazy danych

Co obecnie robię, to utrzymuję licznik czasu bezczynności, gdy ten licznik czasu osiągnie wstępnie zdefiniowany czas, biorę buforowane akcje (akcje od ostatniego zatwierdzenia - co jest tylko prostą listą) i zatwierdzam te akcje do bazy danych.

Interfejs użytkownika musi być jak najbardziej responsywny (duh?).

Oprócz przesyłania danych z bazy danych do osobnego wątku, czy są jakieś inne sugestie dotyczące wydajności, które mogą mi pomóc?

+5

"Działania od 100 do 1000 lat mogą pojawić się w ciągu kilku sekund" - to nie tyle! –

+0

Jestem za oddzielnym wątkiem i ideą kolejki współbieżnej. Prosty. Czysty. (Wątek pisarza może być wsadowy z kolejki, jeśli może, ale poza tym KISS.) –

Odpowiedz

4

Spróbuj użyć zewnętrznych systemów rejestrowania, takich jak NLog, które mają asynchroniczne otoki protokołowania.

+1

Zgadzam się z tym. log4net działa całkiem dobrze dla mnie. –

2

Zapisz działania do ogona pliku dziennika w trakcie wykonywania czynności. Ma to dwie zalety. Jest naprawdę szybki, więc Twój interfejs użytkownika nadal reaguje, co oznacza, że ​​jeśli aplikacja ulegnie awarii, działania nie zostaną utracone.

Następnie mają wątek tła, który podejmuje działania w pliku i aktualizuje bazę danych. Po awarii aplikacji można ponownie uruchomić i wątek w tle po prostu aktualizuje z działaniami, które zostały bezpiecznie zapisane w przeszłości. Możesz nawet mieć oddzielną aplikację application/process/windows, która wykonuje aktualizację w tle i ma aplikację UI, która wykonuje tylko zapisywanie dziennika.

Jeśli naprawdę musisz unikać oddzielnego wątku, musisz wykonać udpates bazy danych w bardzo małych partiach, więc są one tak szybkie, jak to możliwe, i w czasie bezczynności. Ale to podejście zawsze będzie gorsze, ponieważ operacja bazy danych staje się synchroniczna z twoim interfejsem użytkownika. Twój interfejs użytkownika zawiesza się na czas. Każdy problem z bazą danych, taki jak przekroczenie limitu czasu z powodu problemów z połączeniem, następnie zabija interfejs użytkownika.

Powiązane problemy