Множественное подключение к базе данных

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

На данный момент у меня есть метод, который анализирует URL-адрес (в зависимости от URL-адреса приложение должно подключаться к другой базе данных, например, customer1.example.com будет подключаться к базе данных customer1) и вызывает

ActiveRecord::Base.establish_connection(conn_string)

где conn_string содержит имя базы данных.

Этот метод (set_db) вызывается с

before_filter :set_db

в моем контроллере приложения, поэтому в основном для каждого получаемого мной запроса URL-адрес анализируется, и приложение пытается выполнить install_connection.

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

Спасибо! Роберто

вы можете рассмотреть вопрос о том, чтобы указать язык (рубин) в вопросе.

ShoeLace 03.10.2008 19:15
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
5
1
1 318
4

Ответы 4

Я не программист на Ruby, но, вообще говоря, пул соединений - хорошая идея. Вы можете сделать этот пул соединений одноэлементным и передавать / забирать соединения. После восстановления соединения пул может проверить, все ли в порядке.

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

Будьте осторожны с временными таблицами, потому что они принадлежат одному сеансу базы данных. У нас была ошибка, из-за которой в ситуациях с высокой нагрузкой мы сталкивались со странными ошибками. Наконец, мы вспомнили, что использовали временные таблицы в нашем приложении. В ситуации высокой нагрузки соединения с базой данных прерывались и были автоматически восстановлены объектом соединения без ведома кода приложения (мы реализовали повторное соединение, но забыли, что это было проблемой в такой ситуации). Временная таблица, которую мы хотели прочитать, исчезла.

Находятся ли базы данных на одном сервере?

У меня есть приложение, в котором некоторые объекты модели взяты из одной базы данных, а другие - из другой. Я переопределяю функцию table_name, чтобы указать базу данных. Не будет работать, если это разные серверы, но будут работать с разными базами данных на одном сервере.

class xx < ActiveRecord.base

def self.table_name
  "otherdatabase.table"
end

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

Что нового в Edge 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 тысяч клиентских баз данных (и их количество растет), поэтому мы снова объединяем их в небольшое количество сегментированных баз данных.

Другие вопросы по теме