O que é pool de banco de dados?

Respostas:

217

O pool de conexões com o banco de dados é um método usado para manter as conexões com o banco de dados abertas, para que possam ser reutilizadas por outras pessoas.

Normalmente, abrir uma conexão com o banco de dados é uma operação cara, principalmente se o banco de dados for remoto. Você precisa abrir sessões de rede, autenticar, ter a autorização marcada e assim por diante. O pool mantém as conexões ativas para que, quando uma conexão for solicitada posteriormente, uma delas seja usada, em vez de ter que criar outra.

Consulte o diagrama a seguir para os próximos parágrafos:

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

Em sua forma mais simples, é apenas uma chamada de API semelhante (1) a uma chamada de API de conexão aberta que é semelhante à chamada "real". Isso primeiro verifica o pool em busca de uma conexão adequada (2) e, se houver uma disponível, é fornecida ao cliente. Caso contrário, um novo é criado (3).

Uma "conexão adequada" é apenas uma que já tem acesso ao banco de dados usando as informações corretas (como instância do banco de dados, credenciais e possivelmente outras coisas).

Da mesma forma, há uma chamada de API próxima (4) que na verdade não chama a conexão estreita real , mas coloca a conexão no pool (5) para uso posterior. Em algum momento, as conexões na piscina podem estar realmente fechadas (6).

Essa é uma explicação bastante simplista. As implementações reais podem ser capazes de lidar com conexões com vários servidores e várias contas de usuário, elas podem pré-alocar algumas linhas de base de conexões, para que algumas estejam prontas imediatamente, e podem realmente fechar conexões antigas quando o padrão de uso se acalmar.

paxdiablo
fonte
9
De onde você tem esse pequeno gráfico?
Adrian Grigore
19
Eu fiz isso do zero (bobo eu). Se você quiser ver alguns gráficos decentes, dê uma olhada na resposta do zengr.
paxdiablo
1
Se houver uma disponível, que é fornecida ao cliente, caso contrário, uma nova é criada. Da mesma forma, há uma chamada de API próxima que na verdade não chama a conexão estreita real, mas coloca a conexão no pool para uso posterior. Como você mencionou isso, tenho pouca dúvida. Quando 1000 clientes solicitam conexão e não estão fechados. Então, 1000 conexões estão ativas na piscina. Isso será bom para o desempenho da piscina? E deixe-me saber que meu entendimento está um pouco errado?
Ye Win
@ YeWin, não, isso soa bem. Responda à sua pergunta sobre 1000 conexões sendo deixadas no pool, isso pode acontecer, mas geralmente apenas se você terminar em algum momento com 1000 conexões ativas simultâneas. Caso contrário, haveria reutilização e não chegaria a 1000. Em termos disso, veja meu penúltimo parágrafo, particularmente o "pode ​​realmente fechar conexões antigas quando o padrão de uso se acalmar".
22415
1
@DiegoMariani, mais lento do que se eu o tivesse feito manualmente, mais rápido do que se tentasse coagir o MS Word a torná-lo mais fácil :-) #
384
104

As imagens falam mais que mil palavras (paxdiablo deu uma descrição incrível):

texto alternativo

Fonte

zengr
fonte
35
E, aparentemente, boas imagens também falam algumas centenas de peças de arte ASCII :-) #
385
@sagar, selecione a resposta que você achou mais útil. Você não tem registro de aceitação.
zengr
1
Eu vi 4 conexões no Pool.Então, o número de conexão é restrito nesse pool por tipo de pool? Ou o que acontecerá quando a conexão não estiver livre no Pool? Cliente precisa esperar conexão livre ??
Ye Win
1
@DEADEND Realmente depende de como o pool de conexões é implementado. A maioria dos pools cria uma nova conexão quando as conexões atingem a capacidade máxima. Isso pode continuar crescendo até o banco de dados atingir um limite. Em alguns casos (como o oracle jdbc), você pode especificar "tamanho inicial" e "tamanho máximo" durante a construção do conjunto.
zengr 28/02
2
Infelizmente, a imagem não diz a coisa mais importante. Ou seja: Por que manter 10, 20, 30, ... número de conexões abertas custa menos para a memória e o desempenho geral do sistema do que abrir uma conexão quando necessário? Como pode ser? 30 vs. 1 é menos caro? Quão?
Verde
16

Como o nome sugere. Se algumas pessoas querem nadar, elas podem nadar na mesma piscina, faz realmente sentido construir uma nova piscina cada vez que alguém adiciona? Tempo e custo são uma prioridade.

vdegenne
fonte
7

O pool de conexões com o banco de dados é simplesmente armazenar em cache as conexões com os bancos de dados, para que possam ser reutilizadas na próxima vez para reduzir o custo de estabelecer uma nova conexão sempre que desejamos conectar-se a um banco de dados.

Peter
fonte
1

Conceito de pool de conexão não apenas em Java, mas em várias linguagens de programação. Criar um novo objeto de conexão é dispendioso, portanto, um número fixo de conexões é estabelecido e mantido no ciclo de vida, criando um pool virtual Java Just ( http://javajust.com/javaques.html ), consulte a pergunta 14 nesta página

Sandhya Saini
fonte