Что такое пул баз данных?

Ответы:

217

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

Обычно открытие соединения с базой данных - дорогостоящая операция, особенно если база данных удаленная. Вы должны открыть сетевые сеансы, пройти аутентификацию, проверить авторизацию и т. Д. При объединении в пул соединения остаются активными, так что при последующем запросе соединения одно из активных используется вместо создания другого.

Следующие несколько абзацев см. На следующей схеме:

  +---------+
  |         |
  | Clients |
+---------+ |
|         |-+  (1)   +------+   (3)    +----------+
| Clients | ===#===> | Open | =======> | RealOpen |
|         |    |     +------+          +----------+
+---------+    |         ^
               |         | (2)
               |     /------\
               |     | Pool |
               |     \------/
           (4) |         ^
               |         | (5)
               |     +-------+   (6)   +-----------+
               #===> | Close | ======> | RealClose |
                     +-------+         +-----------+

В простейшей форме это просто вызов API (1), аналогичный вызову API открытого соединения, который похож на «настоящий». Сначала выполняется проверка пула на наличие подходящего соединения (2), и, если оно доступно, оно передается клиенту. В противном случае создается новый (3).

«Подходящее соединение» - это просто такое соединение, которое уже имеет доступ к базе данных с использованием правильной информации (такой как экземпляр базы данных, учетные данные и, возможно, другие вещи).

Точно так же есть вызов API закрытия (4), который на самом деле не вызывает реального закрытия соединения, а помещает соединение в пул (5) для дальнейшего использования. В какой-то момент соединения в пуле могут быть фактически закрыты (6).

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

paxdiablo
источник
9
Откуда у вас красивый маленький график?
Адриан Григоре
19
Я сделал это с нуля (глупый я). Если вы хотите увидеть приличную графику, взгляните на ответ zengr.
paxdiablo
1
Если один из них доступен, он предоставляется клиенту, в противном случае создается новый. Аналогичным образом, существует вызов API закрытия, который фактически не вызывает реальное закрытие соединения, а помещает соединение в пул для дальнейшего использования. Когда вы упомянули об этом, у меня небольшой вопрос. Когда 1000 клиентов запрашивают соединение и не закрываются. Значит, в пуле активно 1000 подключений. Это хорошо для производительности пула ?? И дайте мне знать, что мое понимание немного неверно ??
Ye Win
@YeWin, звучит хорошо. Повторите свой вопрос о том, что в пуле осталось 1000 подключений, это может произойти, но обычно только в том случае, если в какой-то момент вы получите 1000 одновременных активных подключений. В противном случае будет повторное использование, и оно не достигнет 1000. Что касается этого, см. Мой предпоследний абзац, особенно бит «может фактически закрыть старые соединения, когда шаблон использования затихнет».
paxdiablo
1
@DiegoMariani, медленнее, чем если бы я делал это вручную, быстрее, чем если бы я пытался заставить MS Word сделать это проще :-)
paxdiablo
105

Изображения говорят тысячу слов (паксдиабло дал потрясающее описание):

альтернативный текст

Источник

zengr
источник
35
И, по-видимому, хорошие изображения тоже говорят на нескольких сотнях фрагментов ASCII-арта :-)
paxdiablo
@sagar, пожалуйста, выберите ответ, который вы считаете наиболее полезным. У вас нет записи о принятии.
zengr
1
Я видел 4 соединения в пуле. Таким образом, количество соединений ограничено в этом пуле типом пула? Или что произойдет, если соединение в пуле не будет бесплатным? Клиенту нужно дождаться бесплатного подключения ??
Ye Win
1
@DEADEND Это действительно зависит от того, как реализован пул соединений. Большинство пулов создают новое соединение, когда соединения достигают максимальной емкости. Это может продолжать расти, пока db не достигнет порогового значения. В некоторых случаях (например, oracle jdbc) вы можете указать «начальный размер» и «максимальный размер» во время самого создания пула.
zengr
2
К сожалению, изображение не говорит самого главного. То есть: почему поддержание 10, 20, 30, ... числа открытых соединений менее затратно для памяти и общей производительности системы, чем открытие одного соединения при необходимости? Как это может быть? 30 против 1 дешевле? Как?
Грин
16

Как следует из названия. Если несколько человек хотят плавать, они могут плавать в одном бассейне, действительно ли имеет смысл строить новый бассейн каждый раз, когда кто-то добавляет? Время и стоимость - приоритет.

vdegenne
источник
7

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

Питер
источник
1

Концепция пула соединений не только в Java, но и во многих языках программирования. Создание нового объекта подключения является дорогостоящим, поэтому фиксированное количество подключений создается и поддерживается в жизненном цикле создания виртуального пула Java Just ( http://javajust.com/javaques.html ) см. Вопрос 14 на этой странице

Сандхья Шайни
источник