“Сервер MySQL ушел” с Ruby on Rails

NullPointerException s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException. Они наиболее распространены, но другие способы перечислены на странице NullPointerException javadoc.

Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException, be:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

В первой строке внутри main я явно устанавливаю ссылку Object obj равной null. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.

(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)

38
задан Peter Mortensen 20 July 2014 в 06:00
поделиться

5 ответов

Это, вероятно, вызывается постоянными соединениями к MySQL, уходящему (испытайте таймаут, вероятно, если это происходит за ночь), и Ruby on Rails не удается восстановить соединение, которое это должно делать по умолчанию:

В файле vendor/rails/actionpack/lib/action_controller/dispatcher.rb является кодом:

if defined?(ActiveRecord)
  before_dispatch { ActiveRecord::Base.verify_active_connections! }
  to_prepare(:activerecord_instantiate_observers) {ActiveRecord::Base.instantiate_observers }
end

метод verify_active_connections! выполняет несколько действий, одно из которых должно воссоздать любые соединения с истекшим сроком.

наиболее вероятная причина этой ошибки состоит в том, что это вызвано тем, что патч обезьяны переопределил диспетчера для не вызова verify_active_connections!, или verify_active_connections! был изменен, и т.д.

22
ответ дан Peter Mortensen 27 November 2019 в 03:14
поделиться

Как другие участники этого потока сказали, наиболее вероятно, что сервер MySQL закрыл соединение с Вашим приложением Ruby on Rails из-за неактивности. Тайм-аут по умолчанию составляет 28 800 секунд или 8 часов.

set-variable = wait_timeout=86400

Добавление этой строки к Вашему /etc/my.cnf повысит тайм-аут до 24 часов http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#option_mysqld_wait_timeout .

, Хотя документация не указывает на него, значение 0 может отключать тайм-аут полностью, но необходимо было бы экспериментировать, поскольку это - просто предположение.

существует однако три других ситуации, что я знаю об этом, может генерировать ту ошибку. Первым является перезапускаемый сервер MySQL. Это, очевидно, отбросит все соединения, но поскольку клиент MySQL пассивен, и это не будет замечено, пока Вы не сделаете следующий запрос.

второе условие состоит в том, если кто-то уничтожает Ваш запрос из командной строки MySQL, и это также отбрасывает соединение, потому что это могло оставить клиент в неопределенном состоянии.

последнее - то, если Ваш сервер MySQL перезапускает себя из-за фатальной внутренней ошибки. Таким образом, если бы Вы делаете простой запрос против таблицы и немедленно видите, что 'MySQL ушел', я внимательно изучил бы журналы Вашего сервера для проверки на аппаратную ошибку или повреждение базы данных.

4
ответ дан Peter Mortensen 27 November 2019 в 03:14
поделиться

Соединение с сервером MySQL, вероятно, испытывает таймаут.

необходимо быть в состоянии увеличить тайм-аут в MySQL, но для надлежащей фиксации, чтобы иметь код проверяют, что соединение с базой данных все еще живо, и снова соединитесь, если это не.

1
ответ дан David Precious 27 November 2019 в 03:14
поделиться

Вы контролируете количество открытых Подключений mysql или потоков? Каковы Ваши настройки mysql.ini для max_connections?

mysql> show status;

Взгляд на Соединения, Max_used_connections, Threads_connected и Threads_created.

Вы, возможно, должны увеличить пределы в своей конфигурации MySQL, или возможно направляющие не закрывают соединение properly*.

Примечание: я только использовал Ruby on Rails кратко...

документация MySQL для состояния сервера находится в http://dev.mysql.com/doc/refman/5.0/en/server-status-variables.html .

1
ответ дан Peter Mortensen 27 November 2019 в 03:14
поделиться

Ruby on Rails 2.3 имеет возможность повторного подключения для подключения к базе данных:

production:
  # Your settings
  reconnect: true

См .:

Удачи!

61
ответ дан 27 November 2019 в 03:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: