2015-05-26 24 views
5

Używam Npgsql do uzyskiwania dostępu do PostgreSQL przez .NET. Obawiam się właściwego sposobu wykonywania połączeń z bazą danych, ponieważ moim zdaniem jest to droga operacja, aby otworzyć połączenie, a następnie zamknąć je za każdym razem, gdy chcę wykonać jakąś transakcję.Dobra technika dla połączeń z PostgreSQL

Więc tutaj jest ogólna idea:

public class PostgreSQL 
{ 
    private NpgsqlConnection conn; // <- one connection for this object, open all the time 

    public PostgreSQL(string connString) 
    { 
     conn = new NpgsqlConnection(connString); 
     conn.Open(); 
    } 

    // ...here making some queries... 

    public void Close() => conn.Close(); // <- use this in the very end of the program 
} 

Jak widać powyżej, mam jedno połączenie do instancji PostgreSQL klasie.

Moje pytanie:

Czy to właściwe podejście? Czy powinienem otwierać i zamykać połączenie za każdym razem, gdy chcę dokonać transakcji - otworzyć tak późno, jak to możliwe i zamknąć tak szybko, jak to możliwe?

Czy powinienem otwierać i zamykać połączenia za każdym razem - czy powinienem napisać kolejkę, która ograniczyłaby ilość współbieżnych połączeń? Lub PostgreSQL sam sobie poradzi - i teoretycznie mogę otworzyć 200 połączeń i wszystko będzie w porządku.

Proszę podzielić się doświadczeniem ze mną ^^

EDIT: będę uruchomić 100-200 zapytań na sekundę.

+0

Prawdopodobnie powinieneś dodać, jak często chcesz wysyłać zapytania do bazy danych. –

+0

@JakubKania Wystarczy dodać, 100-200 zapytań na sekundę. –

+2

'Npgsql' ma wbudowane buforowanie połączeń, więc jakkolwiek wykonasz zapytania, połączenia nie zostaną całkowicie zamknięte i otwarte, nawet jeśli wywołasz' Close() 'i' Open() '. Ale czy jest to aplikacja komputerowa? Czy zapytania są równoczesne? –

Odpowiedz

3

Moim zdaniem powinieneś otworzyć połączenie w momencie, gdy tego potrzebujesz i zamknąć zaraz po nim. Zapobiegnie to utrzymaniu przy życiu wielu połączeń na serwerze.

Z mojego doświadczenia wynika, że ​​otwarcie połączenia nie zajmuje tyle czasu (kilka milisekund, zwykle część czasu wykonania), więc nie musisz się zbytnio martwić.

3

PostgreSQL obsługuje połączenia wspólnego wykorzystania (rozmiar Basen jest customizable), więc wspólny wzór:

using (NpgsqlConnection conn = new NpgsqlConnection(...)) 
{ 
... 
} 

powinno być lepszym wyborem.

Powiązane problemy