Dashing: Ruby: CentOS: не закрытие процессов MySQL

У меня проблемы с моим сервером. Это сервер CentOS RedHat Linux, на котором работает «Dashing» панель управления на основе Ruby/Sinatra.

Я пытаюсь закрыть активные соединения, как определено в моей базе данных MySQL "SHOW PROCESSLIST;"

Пример файла .rb

require 'mysql2'

SCHEDULER.every '10s'do

db = Mysql.new('host_name', 'database_name', 'password', 'table')

mysql1 = "SELECT `VAR` from `TABLE` ORDER BY `VAR` DESC LIMIT 1"
result1 = db.query(mysql1)
result1.each do |row|
strrow1 = row[0]
$num1 = strrow1.to_i
end
...

db.close

LINK[0] = { label: 'LABEL', value: $num1}
...

send_event('LABEL FOR HTML', { items: LINK.values })
end

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

"max_user_connections" reached

Кто-нибудь может придумать, как это исправить?


person Raisus    schedule 17.09.2014    source источник
comment
Требуется больше кода. Если это один из ваших файлов заданий, и вы открываете соединение в своем запланированном блоке Rufus, но закрываете его в конце файла, это будет открывать новое соединение каждый раз, когда ваше задание запускается, но никогда не закроется. Это.   -  person Jeff Price    schedule 17.09.2014
comment
Используйте ORM, например Sequel или Active Record для связи с DBM. Они избавляют от необходимости писать специфичный для DBM код, позволяя быстро выполнять перенос с одной DBM на другую.   -  person the Tin Man    schedule 17.09.2014
comment
@JeffPrice Спасибо за отзыв, это файл задания, строка db.close не в конце файла, но я с радостью предоставлю больше кода из файла.   -  person Raisus    schedule 18.09.2014
comment
@theTinMan Я пытаюсь решить саму проблему, заключающуюся в том, что файлы не закрывают соединение с базой данных MySQL, а не исправляют его с помощью исправления.   -  person Raisus    schedule 18.09.2014


Ответы (1)


Лучше всего размещать DB/File/handle в блоке begin/rescue/ensure. Может быть, что-то происходит, а Руфус/Лихий просто молчит об ошибке, так как они перехватывают исключения и идут своим путем. Это предотвратит закрытие вашего соединения с БД. Симптомы, которые у вас есть, могут быть связаны с похожей проблемой, в любом случае это хорошая идея.

SCHEDULER.every '10s'do
  begin
    db = Mysql.new('host_name', 'database_name', 'password', 'table')

    # .... stuff ....
  rescue
    # what happens if an error happens? log it, toss it, ignore it?
  ensure
    db.close
  end

  # ... more stuff if you want ...
end
person Jeff Price    schedule 18.09.2014
comment
Хорошо ... вы помещаете начало, спасение, обеспечение внутри цикла планировщика ... Не пробовал. (Я пытался с ним вне цикла, но безрезультатно, но я попробую ваш способ и дам вам знать) - person Raisus; 18.09.2014
comment
Попробовал по-вашему. Сначала все было стабильно, но через некоторое время я начал видеть то же самое. Увеличение количества активных подключений к MySQL, как показано в SHOW PROCESSLIST; - person Raisus; 18.09.2014
comment
У вас есть другие задания/процессы, которые могут подключаться к базе данных? Я не администратор mysql, поэтому я не знаю, какую информацию вы можете получить из SHOW PROCESSLIST, но можете ли вы определить, какие приложения/код выполняют подключение? Возможно, у вас где-то другая проблема. - person Jeff Price; 18.09.2014
comment
Не то, чтобы у него не было того же кода, что и в примере, показанном выше. (EDIT: с добавленным началом, спасением, убедитесь, что вы предложили) (EDIT2: MySQL не помогает, так как все это от одного и того же имени пользователя и имени базы данных) - person Raisus; 18.09.2014
comment
Есть ли способ получить от mysql, кто открывает соединения? возможно, включите информацию / уровень ведения журнала (опять же, не администратор mysql). Может быть, гем, который вы используете, имеет какую-то полезную возможность ведения журнала? Или я бы просто запатчил Mysql.new/close, чтобы зарегистрировать открытие/закрытие и попытаться выяснить, где/как открываются соединения. - person Jeff Price; 18.09.2014
comment
Я не уверен, но я думаю, что исправил это, переместив весь код за пределы scheduler, оставив только запросы MySQL и Begin, Rescue и Убедитесь с db.close внутри. Я отметил ваш ответ как принятый, так как он помог. Спасибо - person Raisus; 19.09.2014