TADOConnection – problem z łączeniem do bazy

0

Witam, mam problem z TADOConnection.

Connection łączy się z bazą przy starcie aplikacji i zamyka połączenie przy wyjściu.
Mam też dodatkowy thread który sprawdza czy jest połączenie jako że TADOConnection nie zawsze wykrywa zerwane połączenie (np restart serwera PostgreSQL - Connected pokazuje że jest ok ale połączenia faktycznie nie ma i próba wykonania kwerki kończy się wyjątkiem).
Thread wykrywa problem z połączeniem, zamyka połączenie metodą Connection ->Close() i otwiera ponownie metodą Connection->Open().

Aplikacja uruchomiona, wszystko ok, robię restart serwera, mój thread wykrywa zerwane połączenie i przywraca poprawnie (połączenie znów widoczne w pg_stat_activity i można wywoływać zapytania).
Robię drugi raz restart serwera (czy zabijam połączenie kwerką) i już jest problem - thread wykrywa zerwane połączenie, i przywraca je, metoda Open() wykonuje się poprawnie, Connected znów pokazuje true ale połączenia faktycznie nie ma, nie jest widoczne w pg_stat_activity i próba wywołania zapytania wywołuje wyjątek brak połączenia do bazy. Thread znów wykrywa problem, zamyka i otwiera połączenie i tak w kółko bo połączenia faktycznie nie ma.

Ktoś miał podobną sytuację? Pierwsze zerwane połączenie jest bez problemu przywrócone ale kolejne już nie. Kod jest ok, eventy są generowane poprawnie AfterConnect, Open() jest happy a połączenia nie ma...

0

Nie jestem jakimś mega specem od wątków. Ale wydaje mi się, że nie możesz tak radośnie rozłączać/podłączać połączenia do bazy które jest jest tworzone w głównym wątku z innego wątku. Poczytaj sobie o Synchronize http://docwiki.embarcadero.com/RADStudio/Tokyo/en/Using_the_Main_VCL_Thread Jeśli to nie pomoże to na chwilę obecną nie mam żadnego rozwiązania.

0

Tu nie chodzi o synchronizację, Synchronize działa z normalną aplikacją jeśli z wątku odnosimy się do komponentów widocznych VCL, pod konsolą czy rejestrując apke jako service trzeba używać np Critical Section. Wiem że ADO to COM i nie jest thread safe ale tu wszystkie reguły są zachowane. Tu nie chodzi o sterowanie dostępem do ADOConnection ale jak ADOConnection tworzy połączenie do bazy :/

Dodatkowo zrobiłem teraz test. Mała apka testowa bez żadnego wątku - użyłem Timera do sprawdzania połączenia. Wynik dokładnie taki sam, pierwszy raz przywraca połączenie, drugi raz już nie.

0

W takim razie problem gdzieś leży w jednym z dwóch miejsc. Albo winne jest samo TADOConnection, albo sterownik z którego ADO korzysta. Jedyne do czego wykorzystuję ADO to odczyt plików CDV i tu nie mam tego problemu, więc nie za bardzo Ci więcej mogę pomóc.

Ogólnie to nie wiem czemu z niego korzystasz po pierwsze jest mało wydane, po drugie z mojego doświadczenia są lepsze wybory niż te komponenty. Zawsze możesz spróbować użyć jakichś innych i zobaczyć co się stanie.

0

Wiem że są, ale używam w tym przypadku starego Borlanda 6.0 hehe

0

Już odkryłem co jest powodem i co zrobić by uniknąć tego problemu.

Po jakimś czasie udało mi się ponownie połączyć do bazy co mnie zaskoczyło. Pogrzebałem i wychodzi że to nie TADOConnection ma problem. Problem leży po stronie ODBC:

"When the application releases the connection, the pool returns S_OK to the user, simulating a successful isconnection from the database. However, the actual connection is not released by ODBC but instead waits in the pool. When the next request for a connection to the database that has the same data source and user information comes in, it is satisfied from the connection in the pool rather than by making a full connection to the database."

Aby wyłączyć OLE DB pooling dodałem do mojego ConnectionString: ";OLE DB Services = -2" i teraz działa idealnie :D

Moje pytanie teraz jaki to ma wpływ na działanie ODBC? Czy są jakieś skutki uboczne bo w ulotce dla pacjenta nie znalazłem hehe

0

W takim razie sprawa jest ciężka z tym Builderem 6-tką... ;)

Co do samego wpływu wyłączenia connection poolingu nie mam pojęcia. Nie mniej jednak z pobieżnego wygooglania nic nie wychodzi. Po prostu chyba trzeba zastosować i dokładnie przetestować.

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