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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Это, вероятно, вызывается постоянными соединениями к 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!
был изменен, и т.д.
Как другие участники этого потока сказали, наиболее вероятно, что сервер 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 ушел', я внимательно изучил бы журналы Вашего сервера для проверки на аппаратную ошибку или повреждение базы данных.
Соединение с сервером MySQL, вероятно, испытывает таймаут.
необходимо быть в состоянии увеличить тайм-аут в MySQL, но для надлежащей фиксации, чтобы иметь код проверяют, что соединение с базой данных все еще живо, и снова соединитесь, если это не.
Вы контролируете количество открытых Подключений 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 .
Ruby on Rails 2.3 имеет возможность повторного подключения для подключения к базе данных:
production:
# Your settings
reconnect: true
См .:
Удачи!