2008-10-15 12 views
6

Załóżmy, że mam kod Perla, który zwiększa liczbę kolumn w określonym wierszu bazy danych za każdym razem, gdy jest trafiony, i spodziewam się, że będzie trafiony dość często, więc chciałbym go zoptymalizować za pomocą FCGI. Teraz, ja w zasadzie owinięty większość kodu w coś takiego:Czy muszę umieścić połączenie DB/inicjalizację poza pętlą FCGI, aby skorzystać z FastCGI w Perlu?

while (FCGI::accept() >= 0) { 
[code which currently creates a db connection and makes calls through it] 
} 

Zastanawiam się, czy to lepiej umieścić połączenie z bazą danych (My $ dbh = DBI-> connect (etc)) z zewnątrz Pętla FCGI, aby skrypt utrzymał połączenie przy życiu, czy nadal będę mógł korzystać z zalet FCGI w prędkościach & zasobów, pozostawiając je w pętli?

Odpowiedz

1

Wciąż będziesz zyskiwał z FCGI, nawet jeśli utrzymasz połączenie DB w pętli - ale zyskałbyś jeszcze więcej, gdybyś go przeniósł.

1

Wydajność połączenia zależy w dużej mierze od używanej bazy danych. PostgreSQL i MySQL są bardzo szybkie do połączenia (zwłaszcza MySQL), a więc zazwyczaj łączą się przy każdym żądaniu. Inne bazy danych, takie jak Oracle, są nieco wolniejsze i wymagają dłuższego czasu życia połączenia. Powinno być łatwo przetestować, pisząc 1..100000 pętlę z DBI-> connect() i rozłącz, aby zobaczyć, jak szybko jest twoja baza danych.

3

bmdhacks ma rację, że jeśli używasz MySQL lub PostgreSQL, nie ma to znaczenia, ponieważ połączenia są dość tanie. Ale bez względu na bazę danych zyskasz na szybkości, używając stałych połączeń.

Ale jeśli zdecydujesz się na stałe połączenia, będziesz musiał martwić się o limity czasu połączenia. Nastąpi to w dowolnym momencie w trakcie trwania programu, w zależności od ustawień serwera i natężenia ruchu. ping() jest twoim przyjacielem tutaj. A jeśli potrzebujesz więcej pomocy, spójrz na to, jak robi to Apache::DBI.

2

Nie umieszczaj połączenia poza pętlą, możesz utracić połączenie, a następnie nie można się ponownie połączyć. Możesz umieścić go w globalnym, ale musisz sprawdzić połączenie i ponownie się połączyć.

Zamiast tego użyj funkcji Ima::DBI lub DBI->connect_cached(), aby wykonać buforowanie połączeń. Wykona całą pracę, aby upewnić się, że połączenie jest żywe i ponownie nawiązać połączenie, jeśli to konieczne.

Ale zanim zawracasz sobie głowę, wykonaj testy porównawcze, aby dowiedzieć się, gdzie naprawdę jest twoje wąskie gardło. W przeszłości miałem połączenie z bazą danych, które było wąskim gardłem, ale było to z Oracle i było to ponad 10 lat temu.

Powiązane problemy