TADOConnection - czy jest thread safe?

0

Witam, czy TADOConnection z Borland 6.0 jest thread safe? Connection jest tworzony na głównej formie i otwiera połączenie z bazą a inne wątki mają własne kontrolki (DataSet-y) które są podpięte pod w/w Connection na głównej formie. Używając TADOQuery, TADOStoreProc nie widzę problemu gdy każdy wątek ma własne kontrolki, jedyny problem widzę w używaniu TADOTable (otwarcie tabeli, wykonanie jakiś operacji, zamknięcie gdy w międzyczasie inny wątek może też coś modyfikować). Ale wracając, kluczowe pytanie czy Connection jest thread safe? Czy każdy wątek ma tworzyć osobne połączenie do bazy co może być problemowe gdy mamy dużo wątków.

PS ADO to COM objekt więc musi być inicjalizowany CoInitialize / CoUninitialize, czy to nie determinuje że każdy wątek powinien inicjalizować COM i mięc własne połączenie do bazy?

PS2 Znalazłem artykuł który wyraźnie mówi że nie można używać connection z głównej formy :/
link

PS3 Jeśli więc nie można to jak uniknąć tworzenia zbyt wielu połączeń do bazy? Jeśli mamy kilkanaście wątków to nie problem ale jeśli mamy kilkadziesiąt lub kilkaset to już problem.

PS4 Czy zamieniając ADO na libpq lib uniknę tego problemu? Czy libpq jest thread safe? - Widzę że nie jest thread safe

PS5 Czy tworząc i usuwając connection po wykonaniu polecenia postgres automatycznie i natychmiastowo usunie połączenie? Czy ma własny mechanizm do usuwania i połączenia są usuwane kiedy stwierdzi że już czas (czyli nie w momencie usunięcia Connection gdy wątek zakończy dziełanie)? Pytam bo miałem kiedyś takie odczucie że usuwając połączenia nie były one od razu usunięte po stronie pg co powodowało osiągnięcie max połączeń kiedy tak naprawdę nie było tylu.

0

Wprawdzie Borland'a nie używałem od dekady, ale postaram się trochę pomóc.
Na jakieś 95% obiekt Connection nie jest thread safe - każdy wątek powinien mieć swój. Ogólnie ta zasada tyczy się wszystkich komponentów/obiektów o których nie jest jawnie powiedziane, że można je dzielić pomiędzy wątkami.

jak uniknąć tworzenia zbyt wielu połączeń do bazy?

Trzymaj się zasady jeden wątek - max jedno połączenie do DB. Może powinieneś się zastanowić po co Ci tak wiele wątków? Powoływanie nowych wątków i ich synchronizacja to dodatkowy koszt.

Czy to jest obejście na czasochłonne zapytania SQL? Jeśli tak to najpierw powinieneś je zoptymalizować te zapytania.
Pomyśl nad wydzieleniem kilku dedykowanych wątków które będą komunikowały się z DB i to do nich deleguj wszystkie zapytania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1