Пул соединений для динамических подключений к базе данных

Настройка проблемы основана на веб-сервисе (Spring/Java, Tomcat7 и MySql), где каждый пользователь получает свою собственную базу данных, поэтому каждому запросу требуется собственное соединение. Поскольку все базы данных создаются динамически во время выполнения, их статическая настройка перед запуском не является вариантом.

Чтобы оптимизировать использование подключения к базе данных, реализация пула соединений с базой данных будет отличной, верно?

С Java/ Spring: как создать пул соединений для динамических баз данных? Меня немного поражает отсутствие чистых вариантов здесь!

Проблема: Tomcat Connection Pool (и насколько я понимаю C3P0) рассматривает каждый новый экземпляр DataSource как новый пул соединений → ссылка на стек

  • Это хорошая идея создать статический источник данных с общим подключением MySql (без указания базы данных при подключении) и использовать пул соединений с этим источником данных вместе с адаптированными операторами SQL?
    ссылка на стек
  • Как насчет разработки настраиваемого постоянного источника данных на базе пула данных? Какой-нибудь опыт работы здесь? Любой совет? Любые библиотеки, которые это делают?
  • Или было бы целесообразно обходить проблему Tomcat DataSource, динамически создавая источники данных Tomcat JNDI, манипулируя им context.xml динамически с Java?
  • Я не могу поверить, что для этого не существует более простых/простых решений. Grails/Hibernate борется с этим, Java/JDBC борется с этим,... это такой редкий случай использования для разделения пользовательских данных на основе пользователя путем динамического создания пользовательских баз данных? Если да, то какая будет лучшая настройка?

ИЗМЕНИТЬ

  1. Другим вариантом является предложение @M.Deinum использовать один настроенный источник данных и динамически перетаскивать его для правильного соединения → Блог M.Deinum и ссылка на стек.
    Как это работает с пулом соединений, например, выше?

Ответ 1

Я считаю, что HikariCP работает без необходимости указывать одну базу данных.

Ответ 2

Как только базы данных создаются во время выполнения, вы должны создавать пулы также во время выполнения. Я боюсь, что инфраструктура spring не дает вам никакой помощи здесь, поскольку она настроена на обычный статический вариант использования.

У меня будет карта пулов:

  • имеют
     Map < connectionUrlString,List< c3poPool > > map
  • при запросе соединения, получите соответствующий пул c3po с карты
  • и вы можете получить лучшее из обоих миров, поскольку реальный пул соединений для каждой динамически создаваемой базы данных обрабатывается экземпляром c3po, но вы можете создавать новые экземпляры во время выполнения

Это работает как низкоуровневое решение. Если вы хотите пойти дальше, вы можете обернуть эту логику в провайдер соединения db и зарегистрировать это как "драйвер". Таким образом, любая часть вашего приложения запрашивает новое соединение, вы можете просто вернуть одно соединение из существующих пулов (и если запрашивается совершенно новое соединение, создайте для этого новый пул).

Ответ 3

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

По моему опыту, у меня была аналогичная ситуация, и это было решительно с фреймворком spring. Позвольте мне объяснить вам, как вы решите этот вопрос.

  • Создайте конфигурационный файл spring с такими характеристиками: a) Загружатель ресурсов: этот отвечает за свойства загрузки из файлов конфигураций или из базы данных, эти свойства будут присваивать для установления соединения с базой данных. b) Конфигурация базы данных пула, параметризованная свойствами, которые вы загрузите.

  • Создайте класс локатора: в этом классе вам понадобится HashMap

  • Использовать многоконтурную функцию spring: идея назначает код для каждого установленного вами соединения и затем загружает это соединение подобно контексту приложения с помощью spring, а затем в классе локатора на карте, что контекст и использовать его так часто, как вам нужно.

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