Пути вокруг пула соединений ActiveRecord - PullRequest
1 голос
/ 21 сентября 2010

Я пишу Adhearsion компонент, который использует ActiveRecord.Проблема заключается в том, что компонент может работать в течение нескольких минут (продолжительность вызова).В течение этого времени компонент имеет объект ActiveRecord в качестве переменной экземпляра.Этот объект использует одно соединение с базой данных из пула соединений.В зависимости от количества абонентов пул соединений может быть преждевременно исчерпан.Данные сохраняются несколько раз во время разговора, но не должны быть доступны мгновенно.Хотя использование ActiveRecord очень удобно, оно не нужно.Я могу представить несколько решений и хотел бы спросить мнения, советы и альтернативные решения от сообщества:

  • Иметь очень большой пул подключений (> 1000 подключений).
  • Заявить иосвобождать соединение с базой данных каждый раз, когда мой объект ActiveRecord изменяется.Не знаю, как это сделать, примеры кода приветствуются.
  • Запись данных в файл журнала, который регулярно импортируется в базу данных.
  • Настройка веб-службы на отдельномсерверный процесс, который принимает данные через HTTP-запрос и записывает их в базу данных.
  • Используйте очередь сообщений, в которую отправляются данные.Рабочий импортирует данные в БД.

Мне не нравятся решения, для которых требуется запуск внешнего программного обеспечения (очередь сообщений, веб-служба).

Ответы [ 2 ]

1 голос
/ 18 января 2012

Мы обратились к этому вопросу в сообщении в блоге на нашем сайте: http://mojolingo.com/blog/2011/scaling-activerecord-in-adhearsion/

В сообщении в блоге объясняется проблема, с которой вы столкнулись, а также одно возможное решение для ее устранения.Мы также выпустили гем, который реализует описанное решение: https://github.com/adhearsion/activerecord-wrap-with-connection

Мы переосмысливаем, как ActiveRecord будет работать с Adhearsion 2.0, поэтому в будущем этот гем не должен быть необходим.

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

Adhearsion в настоящее время не очищает проверенные соединения ActiveRecord так, как должно.

Если вы звоните ActiveRecord::Base.connection_pool.release_connection в блоке ensure в конце вашей абонентской группы, вы можете убедиться, что соединения неудерживается дольше, чем нужно.

Это должно означать, что ваш пул соединений должен быть таким же большим, как количество одновременных вызовов, которые вы обрабатываете.

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