Пул соединений с базой данных - PullRequest
4 голосов
/ 01 ноября 2011

Я создал небольшое приложение для чата в Sinatra и jQuery на heroku.Он просто вставляет сообщение в базу данных, когда пользователь отправляет его.А также загружает новые сообщения каждые 2 секунды.После нескольких минут тестирования он перестал работать, и я получил электронную почту heroku:

Привет,

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

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

Спасибо, -Chris

Это действие, поддерживающее отправку сообщения (получение очень похоже):

post '/send' do
  con = con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)
  con.exec("insert into messages(usr, msg, date) values('#{params[:usr]}','#{params[:msg]}', now())")    
end

Как следуетЯ изменил его, чтобы включить пул соединений?

Ответы [ 3 ]

6 голосов
/ 01 ноября 2011

Да, это правда, вы действительно открываете новое соединение с базой данных каждый раз, когда отправляется сообщение «отправить».

Так что вам нужно это изменить. Одна возможность может быть, чтобы открыть соединение глобально:

 $con = PGconn.connect($dbhost, 5432, "","",$dbname, $dbuser, $dbpass)

Это должно быть сделано после того, как вы инициализировали переменные $ dbname ..., но перед тем, как использовать какие-либо маршруты.

Однако, если вы используете модульную версию sinatra, вместо классической, вы можете объявить переменную экземпляра с помощью

attr_accessor :con

и инициализируйте его перед запуском приложения.

4 голосов
/ 02 ноября 2011

Робуст на полпути Создание переменной экземпляра создаст соединение для каждого экземпляра вашего класса.

То, что вам нужно, - это API потока хранилища данных, которое будет использовать мьютекс для обработки доступа к объектам вашего соединения. Это механизм управления, который ActiveRecord использует в рельсах.

Я создал рубиновый самоцвет под названием 'q', который предоставляет простой механизм для этого. Драгоценный камень находится здесь: https://github.com/jacobsimeon/q

установить вот так git clone https://github.com/jacobsimeon/q

затем добавьте это в любой файл, который инициализирует ваше приложение: require 'q/resourcepool'

затем создайте хранилище данных во время инициализации:

class DataConnection < ResourcePool
  def create_resource
    PGConn.connect(@config)
  end
end
@datasource = ResourcePool.new(your_connection_info_here)

затем вы можете использовать @datasource для выполнения команд в вашей базе данных

post '/send' do
  @datasource.exec(standard_postgres_params)
end

Свяжитесь со мной на github или в твиттере (@jacobsimeon на обоих), если вы заинтересованы в этом.

1 голос
/ 23 марта 2013

Я использовал «классическое» приложение sinatra и получил тот же результат, объявив переменные класса: например, @@ db_connection.Это всегда использует одно и то же соединение и работает для меня.

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