Я пытаюсь понять, как лучше всего подключиться к своим базам данных.
На данный момент у меня есть метод, который анализирует URL-адрес (в зависимости от URL-адреса приложение должно подключаться к другой базе данных, например, customer1.example.com будет подключаться к базе данных customer1) и вызывает
ActiveRecord::Base.establish_connection(conn_string)
где conn_string содержит имя базы данных.
Этот метод (set_db) вызывается с
before_filter :set_db
в моем контроллере приложения, поэтому в основном для каждого получаемого мной запроса URL-адрес анализируется, и приложение пытается выполнить install_connection.
Мне было интересно, могу ли я где-нибудь создать пул подключений ... у вас есть какие-нибудь предложения по этому поводу? Лучше ли иметь синглтон, который сохраняет все сделанные подключения и возвращает нужный?
Спасибо! Роберто





Я не программист на Ruby, но, вообще говоря, пул соединений - хорошая идея. Вы можете сделать этот пул соединений одноэлементным и передавать / забирать соединения. После восстановления соединения пул может проверить, все ли в порядке.
У вас должен быть отдельный жизненный цикл и право собственности для каждого соединения, чтобы два потока не использовали соединение одновременно.
Будьте осторожны с временными таблицами, потому что они принадлежат одному сеансу базы данных. У нас была ошибка, из-за которой в ситуациях с высокой нагрузкой мы сталкивались со странными ошибками. Наконец, мы вспомнили, что использовали временные таблицы в нашем приложении. В ситуации высокой нагрузки соединения с базой данных прерывались и были автоматически восстановлены объектом соединения без ведома кода приложения (мы реализовали повторное соединение, но забыли, что это было проблемой в такой ситуации). Временная таблица, которую мы хотели прочитать, исчезла.
Находятся ли базы данных на одном сервере?
У меня есть приложение, в котором некоторые объекты модели взяты из одной базы данных, а другие - из другой. Я переопределяю функцию table_name, чтобы указать базу данных. Не будет работать, если это разные серверы, но будут работать с разными базами данных на одном сервере.
class xx < ActiveRecord.base
def self.table_name
"otherdatabase.table"
end
Также похоже, что пул баз данных может быть на подходе для будущей версии rails.
Сначала о комментарии, оставленном к вашему первоначальному сообщению: это ничего такого связано с рубином. это все связано с дизайном рельсов.
с учетом сказанного, вы, вероятно, могли бы перехватить поведение ActiveRecord :: Base, чтобы хэш подключений индексировался ключом (в вашем случае ключом будет имя пользователя), а затем перехватить install_connection для проверки в пуле, если соединение уже открыто
для этого потребуется повторно открыть базу ActiveRecord, что делает ваши изменения зависимыми от внутренних компонентов AR.
Я не собираюсь отвечать на ваш вопрос о пуле. Тем не менее, я уверен, что объединение средств поможет значительно улучшить ситуацию. У меня также есть установка, в которой каждый клиент имеет свою собственную базу данных, и база кода используется совместно между ними.
Метод синтаксического анализа URL-адреса реализован вне Rails в конфигурации Apache Rewrite, поскольку несколько хостов могут быть сопоставлены одному клиенту. Также я использую «ключ» клиента для доступа к кэшированным файлам на диске веб-сервера. Конфигурация перезаписи выглядит примерно так:
RewriteMap accounts prg:domain_mapper.rb
RewriteMap lowercase int:tolower
RewriteCond %{HTTP_HOST} ^(.*)$
RewriteCond ${accounts:${lowercase:%1}} ^(.+)$
RewriteRule . - [E=ACCOUNT:%1]
RequestHeader set Customer-Key %{ACCOUNT}e
И ключ клиента будет отображаться непосредственно на имя базы данных, которое будет связано в методе before_filter.
Пока что переключение соединения с базой данных на стороне Rails не является проблемой производительности. Проблемы возникают в конфигурации MySQL, и мы сталкиваемся с проблемами, когда слишком много баз данных и слишком много запросов вызывают слишком много открытых баз данных в MySQL.
Я уверен, что вы рассматривали возможность переноса. Поначалу это не было проблемой со схемами базы данных <2000. Сейчас существует более 15 тысяч клиентских баз данных (и их количество растет), поэтому мы снова объединяем их в небольшое количество сегментированных баз данных.
вы можете рассмотреть вопрос о том, чтобы указать язык (рубин) в вопросе.