Есть ли способ отключить Active Record во время выполнения (или просто ухудшиться из-за сбоя БД) - PullRequest
0 голосов
/ 27 сентября 2010

В моем приложении Rails 2.3 возможна ситуация, когда база данных не работает, но приложение все еще должно работать.Т.е. мне нужно отключить часть моего приложения, когда база данных не работает.Например, есть какой-то метод, например is_database_up?, который вернет true, если база данных работает.На данный момент, если база данных рушится, целое приложение тоже рухнет.Есть ли способ справиться с этой ситуацией?

PS: Я на самом деле спрашиваю "Что положить внутрь is_database_up?".Т.е. есть ли способ отловить исключения ActiveRecord и сказать ActiveRecord не использовать какую-либо базу данных?Или есть какой-либо способ понять, что база данных не работает во время выполнения с помощью любого метода ActiveRecord.Как то так.

Ответы [ 2 ]

0 голосов
/ 27 сентября 2010

Вы можете использовать ActiveRecord::Base.connected?

0 голосов
/ 27 сентября 2010

Что ж, лучший способ справиться с этим - убедиться, что база данных приложения никогда не выйдет из строя.Возможно, вы делаете это, подключаясь к другой базе данных, которая подчиняет ту, которая может подниматься и опускаться, так что если ведущий db падает, подчиненный продолжает, а затем обновляет / обновляет мастер, как только мастер возвращается.Тогда вы избавитесь от нестабильности мастер БД.Это лучшее решение.

Но, чтобы ответить на ваш вопрос:

В начале каждого запроса вам нужно посмотреть, работает ли база данных или нет, а затем отреагировать соответствующим образом.Например, если они пытаются сделать что-то, нуждающееся в БД, вам нужно перенаправить их куда-либо еще.

Я бы сделал это с before_filter в ApplicationController, что-то вроде

before_filter :requires_database
...
protected
def requires_database
  redirect_to root_path unless database_is_up?
end

Youзатем можно игнорировать этот фильтр на страницах (предположительно, меньшинство страниц веб-сайта), которые не нуждаются в БД, с (например)

#in home_controller
skip_before_filter :requires_database

. Затем возникает проблема с тем, чтопроисходит, если БД падает на полпути через запрос.Это довольно ужасная ситуация, чтобы попытаться справиться с ней, я не буду вдаваться в подробности прямо сейчас.По сути, избегайте возможности, если сможете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...