8

Mam aplikację 4 szyny, którą hostuję na heroku. Dają one pewną szczególną poradę dotyczącą zarządzania pulą połączeń DB podczas korzystania z serwera wielowątkowego (puma). https://devcenter.heroku.com/articles/concurrency-and-database-connectionsSzyny Heroku - Wyłącz Active Record Połączenie Postgresowe

Po uruchomieniu testu obciążenia dla mojej aplikacji wystąpił błąd - nie można połączyć się z bazą danych. kiedy każda strona była uderzana, szyny inicjują aktywny rekord, nawet jeśli nie robię żadnych zapytań na tej stronie lub odwołuję się do żadnego modelu.

Moje pytanie brzmi:

Jak mogę zrobić coś w rodzaju białej listy (lub czarnej liście) tak, że aktywny rekord nie jest inicjowany z połączeniem dB dla tych konkretnych działań kontrolera? W inicjalizatorze?

Idealnie byłoby uruchomić tańszą usługę postgres na heroku (40 połączeń), ponieważ wiem, że moja aplikacja nie korzysta z db bardzo często. Jeśli ruch trafi wyżej, 40 rzeczy zaczną błędnie działać, co wydaje się głupie dla aplikacji, która nie użyje bazy danych na tych żądaniach.

czytałem o tym, jak wyłączyć aktywny rekord dla całej aplikacji: Disable ActiveRecord for Rails 4

Ale jak mogę selektywnie go aktywować? Czy są jakieś inne względy różną wydajność tutaj (przez nie chętny załadunku te rzeczy lub innych pułapek)

+0

połączenie użycie pooling. –

Odpowiedz

0

w was application_controller.rb

before_filter :maybe_disconnect_db 

def maybe_disconnect_db 
    ActiveRecord::Base.remove_connection() if ActiveRecord::Base.connected? 
end 

def maybe_connect_db 
    ActiveRecord::Base.establish_connection() unless ActiveRecord::Base.connected? 
end 

Następnie dla każdego kontrolera/akcji, która wymaga połączenia db dodać

skip_before_filter :maybe_disconnect_db, #only or unless filter here 
before_filter  :maybe_connect_db, #only or unless filter here 

Powinno to ustanowić połączenie dla dowolnego konkretnego żądania db, i rozłączyć dla każdego żądania, które nie jest potrzebne, jednocześnie obsługując wiele żądań db w wierszu bez działania i wiele żądań innych niż db z rzędu bez działania.

ActiveRecord::Base.remove_connection

ActiveRecord::Base.establish_connection