Alguém pode fornecer exemplos ou links sobre como estabelecer um pool de conexão JDBC?
Ao pesquisar no Google, vejo muitas maneiras diferentes de fazer isso e é bastante confuso.
Em última análise, preciso que o código retorne um java.sql.Connection
objeto, mas estou tendo problemas para começar ... todas as sugestões são bem-vindas.
Atualização: não tem javax.sql
ou java.sql
tem implementações de conexão em pool? Por que não seria melhor usar isso?
Respostas:
Se você precisar de um pool de conexão autônomo, minha preferência vai para C3P0 em vez de DBCP (que mencionei na resposta anterior ). Eu simplesmente tive muitos problemas com DBCP sob carga pesada. Usar o C3P0 é muito simples. Da documentação :
Mas se você estiver executando dentro de um servidor de aplicativos, eu recomendaria usar o pool de conexão embutido que ele fornece. Nesse caso, você precisará configurá-lo (consulte a documentação do seu servidor de aplicativos) e recuperar um DataSource via JNDI:
fonte
Normalmente, se você precisa de um pool de conexão, está escrevendo um aplicativo que é executado em algum ambiente gerenciado, ou seja, está executando dentro de um servidor de aplicativos. Se este for o caso, certifique-se de verificar quais facilidades de pool de conexão seu servidor de aplicação oferece antes de tentar qualquer outra opção.
A solução out-of-the-box será a mais bem integrada com o resto das instalações dos servidores de aplicativos. Se, no entanto, você não estiver executando dentro de um servidor de aplicativos, eu recomendaria o componente Apache Commons DBCP . É amplamente utilizado e fornece todas as funcionalidades básicas de pool de que a maioria dos aplicativos exige.
fonte
HikariCP
É moderno, é rápido, é simples. Eu o uso para cada novo projeto. Eu prefiro muito mais que C3P0, não conheço muito bem as outras piscinas.
fonte
Não reinvente a roda.
Experimente um dos componentes de terceiros disponíveis:
O Apache DBCP vem com um exemplo diferente de como configurar um javax.sql.DataSource em pool . Aqui está um exemplo que pode ajudá-lo a começar.
fonte
disclecsia
levou o melhor de mim. Você pode ver que o link está correto. :)tomcat-jdbc
. Você pode obtê-lo no Maven Central ->org.apache.tomcat:tomcat-jdbc:jar:7.0.22
-> search.maven.org/…Eu recomendaria usar a biblioteca commons-dbcp . Existem vários exemplos listados sobre como usá-lo, aqui está o link para o simples mover . O uso é muito simples:
Você só precisa criar a fonte de dados uma vez, portanto, certifique-se de ler a documentação se não souber como fazer isso. Se você não está ciente de como escrever instruções JDBC adequadamente para não vazar recursos, também pode ler esta página da Wikipedia .
fonte
javax.sql.DataSource
definição da interface contém uma implementação de "pool de conexão". (Além disso, acho que você já sabe o que é uma interface JDBC)No servidor de aplicativos que usamos onde trabalho (Oracle Application Server 10g, se bem me lembro), o pooling é feito pelo servidor de aplicativos. Recuperamos um
javax.sql.DataSource
usando uma pesquisa JNDI com umjavax.sql.InitialContext
.fez algo assim
(Não escrevemos este código, ele é copiado desta documentação .)
fonte
Piscina
performance
[Ao reutilizar os mesmos objetos para realizar qualquer ação nos Dados-Objeto] &memory
[alocar e desalocar muitos objetos cria uma sobrecarga de gerenciamento de memória significativa].«Pooling [
Object
pool, poolString
constante,Thread
pool, pool de conexão]Pool Constant String
Exemplo: String para verificar o Objeto Único do pool.
Pool de conexão usando tipo-4 driver usando bibliotecas 3o partido [
DBCP2
,c3p0
,Tomcat JDBC
]Type 4 - The Thin driver converts JDBC calls directly into the vendor-specific database protocol Ex[Oracle - Thick, MySQL - Quora].
wikiNo mecanismo de pool de conexão, quando a classe é carregada, ela obtém os
physical JDBC connection
objetos e fornece um objeto de conexão física encapsulado ao usuário.PoolableConnection
é um invólucro em torno da conexão real.getConnection()
escolha uma das conexões empacotadas livres do pool de objetos de conexão e a retorne.close()
em vez de fechá-lo, retorna a conexão agrupada de volta ao pool.Exemplo: Usando o pool de conexão ~ DBCP2 com Java 7 [
try-with-resources
]jdbc:<DB>:<drivertype>:<HOST>:<TCP/IP PORT>:<dataBaseName>
jdbc:
oracle
:thin:@localhost:1521:myDBName
jdbc:
mysql
://localhost:3306/myDBName
connectionpool.properties
Aplicação Web : Para evitar problemas de conexão quando todas as conexões forem fechadas [MySQL "wait_timeout" padrão 8 horas] para reabrir a conexão com o banco de dados subjacente.
Você pode fazer isso para testar todas as conexões definindo testOnBorrow = true e validationQuery = "SELECT 1" e não use autoReconnect para o servidor MySQL, pois ele está obsoleto. questão
Veja também:
fonte
public class StringPoolTest
apenas 2 métodos nulos para que eles não retornem nada. Esse código realmente passa pelo processo de gerenciamento do pool de strings? Nem parece usar nenhum argumento.s1
não está definido?ConnectionPool
classe. Muito obrigado.No final de 2017, Proxool, BoneCP, C3P0, DBCP estão praticamente extintos neste momento. HikariCP (criado em 2012) parece promissor, abre portas para qualquer outra coisa que eu conheça. http://www.baeldung.com/hikaricp
Proxool tem uma série de problemas:
- Sob carga pesada pode exceder o número máximo de conexões e não retornar abaixo do máximo
- Pode gerenciar para não retornar às conexões mínimas, mesmo depois que as conexões expiram
- Pode bloquear todo o pool (e todos os encadeamentos de servidor / cliente) se tiver problemas para se conectar ao banco de dados durante o thread HouseKeeper (não usa .setQueryTimeout)
- o thread HouseKeeper, embora tenha bloqueio de pool de conexão para seu processo, solicita que o thread Prototyper recrie conexões (varredura) que podem resultar em condição de corrida / bloqueio. Nessas chamadas de método, o último parâmetro deve ser sempre sweep: false durante o loop, apenas sweep: true abaixo dele.
- O HouseKeeper só precisa de uma única varredura de PrototypeController no final e tem mais [mencionado acima]
- Verificações de thread do HouseKeeper para teste de conexões antes de ver quais conexões podem ter expirado [algum risco de teste de conexão expirada que pode ser interrompida / encerrada por meio de outros tempos limite para o banco de dados no firewall, etc.]
- O projeto tem código inacabado (propriedades que são definidas mas sem ação)
- A vida útil máxima da conexão padrão, se não definida, é 4 horas (excessiva)
- O encadeamento do HouseKeeper é executado a cada cinco segundos por pool (excessivo).
Você pode modificar o código e fazer essas melhorias. Mas como foi criado em 2003 e atualizado em 2008, faltam quase 10 anos de melhorias em java que soluções como o hikaricp utilizam.
fonte
Conforme respondido por outros, você provavelmente ficará feliz com o Apache Dbcp ou c3p0 . Ambos são populares e funcionam bem.
Em relação à sua dúvida
Eles não fornecem implementações, em vez de interfaces e algumas classes de suporte, apenas relevantes para os programadores que implementam bibliotecas de terceiros (pools ou drivers). Normalmente você nem olha para isso. Seu código deve lidar com as conexões de seu pool da mesma forma que se tratam de conexões "simples", de forma transparente.
fonte
O Vibur DBCP é outra biblioteca para esse fim. Vários exemplos mostrando como configurá-lo para uso com Hibernate, Spring + Hibernate ou programaticamente podem ser encontrados em seu site: http://www.vibur.org/
Além disso, veja o aviso legal aqui .
fonte
O Apache Commons possui uma biblioteca para esse fim: DBCP . A menos que você tenha requisitos estranhos em torno de suas piscinas, eu usaria uma biblioteca, pois ela deve ser mais complicada e sutil do que você espera.
fonte
Você deve considerar o uso de UCP. Universal Connection Pool (UCP) é um pool de conexão Java. É um pool de conexão rico em recursos e totalmente integrado aos bancos de dados Real Application Clusters (RAC), ADG e DG da Oracle.
Consulte esta página para obter mais detalhes sobre o UCP.
fonte
MiniConnectionPoolManager
é uma implementação de um arquivo java, se você está procurando uma solução incorporável e não está muito preocupado com o desempenho (embora eu não tenha testado a esse respeito).É EPL , LGPL e MPL multi-licenciado .
Sua documentação também fornece alternativas que valem a pena verificar (além de DBCP e C3P0):
fonte