O que é um pool de conexão de banco de dados?

Em Java, as tecnologias de acesso a banco de dados podem ser divididas nas seguintes categorias:

  • JDBC acessa diretamente o banco de dados
  • Tecnologia JDO
  • Ferramentas O / R de terceiros, como Hibernate, ibatis, mybatis, etc.

JDBC é a base do java para acessar o banco de dados, JDO, Hibernate, etc. apenas encapsular melhor o JDBC.
JDBC (Java Database Connectivity) é uma interface pública (um conjunto de APIs) que é independente de um sistema de gerenciamento de banco de dados específico e um acesso e operação geral de banco de dados SQL . Ele define uma biblioteca de classes Java padrão para acessar o banco de dados, (java.sql , javax .sql) Use esta biblioteca para acessar facilmente os recursos do banco de dados de uma forma padrão. O JDBC fornece uma maneira unificada de acessar bancos de dados diferentes , protegendo alguns problemas detalhados para os desenvolvedores. O objetivo do JDBC é permitir que os programadores Java usem o JDBC para se conectar a qualquer sistema de banco de dados que forneça um driver JDBC, para que os programadores não precisem saber muito sobre as características de um sistema de banco de dados específico, o que simplifica e acelera muito o processo de desenvolvimento.
Insira a descrição da imagem aqui
Claro, você pode usar os drivers de diferentes fornecedores de banco de dados sem usar uma interface JDBC unificada, mas isso não refletirá a portabilidade do Java.
JDBC é um conjunto de interfaces fornecido pela empresa Sun para operações de banco de dados. Os programadores Java só precisam programar para este conjunto de interfaces. Diferentes fornecedores de banco de dados precisam fornecer implementações diferentes para este conjunto de interfaces. A coleção de diferentes implementações é o condutor de diferentes bancos de dados. ----- Programação orientada a interface

Ou seja,
JDBC: um conjunto de
drivers JDBC de interface para operações de banco de dados : diferentes implementações precisam ser fornecidas para esse conjunto de interfaces. A coleção de diferentes implementações é o driver de diferentes bancos de dados. Por exemplo, o uso de mysql requer um pacote jar controlado por mysql

Pool de conexão de banco de dados c3p0, dhcp

Ao usar e desenvolver programas da web baseados em banco de dados, o modo tradicional (JDBC) basicamente segue as seguintes etapas:

  1. Estabeleça uma conexão de banco de dados no programa principal (como servlet, beans)
  2. Executar operações sql
  3. Desconecte a conexão do banco de dados

No entanto, existem problemas com este modo de desenvolvimento:
as conexões de banco de dados JDBC comuns são obtidas usando DriverManager. Cada vez que uma conexão é estabelecida com o banco de dados, a conexão deve ser carregada na memória e, em seguida, o nome de usuário e a senha são verificados (ele leva 0,05s ~ 1s). Quando uma conexão de banco de dados é necessária, uma é solicitada do banco de dados e a conexão é desconectada após a conclusão da execução. Desta forma, consumirá muitos recursos e tempo. Os recursos de conexão do banco de dados não foram bem reutilizados. Se centenas ou até milhares de pessoas estiverem online ao mesmo tempo, as operações frequentes de conexão do banco de dados ocuparão muitos recursos do sistema e podem até causar travamentos do servidor.
Para cada conexão de banco de dados, ele deve ser desconectado após o uso. Caso contrário, se o programa não desligar devido a uma anormalidade, isso causará um vazamento de memória no sistema de banco de dados e, eventualmente, fará com que o banco de dados seja reiniciado.
Esse tipo de desenvolvimento não pode controlar o número de objetos de conexão criados e os recursos do sistema serão alocados sem consideração. Se houver muitas conexões, isso também pode causar vazamentos de memória e travamentos do servidor.
Para resolver o problema de conexão com o banco de dados no desenvolvimento tradicional, a tecnologia de pool de conexão com o banco de dados pode ser usada.
A ideia básica do conjunto de conexões com o banco de dados é estabelecer um "conjunto de buffers" para conexões com o banco de dados. Coloque um certo número de conexões no buffer pool com antecedência.Quando você precisa estabelecer uma conexão com o banco de dados, você só precisa tirar uma do "buffer pool" e colocá-la de volta após o uso.
O pool de conexão de banco de dados é responsável por alocar, gerenciar e liberar conexões de banco de dados.Ele permite que os aplicativos reutilizem uma conexão de banco de dados existente em vez de restabelecê-la.
Quando o conjunto de conexões com o banco de dados é inicializado, um determinado número de conexões com o banco de dados é criado e colocado no conjunto de conexões.O número dessas conexões com o banco de dados é definido pelo número mínimo de conexões com o banco de dados. Independentemente de essas conexões de banco de dados serem usadas ou não, o pool de conexão sempre garantirá que haja pelo menos esse número de conexões. O número máximo de conexões de banco de dados no pool de conexão limita o número máximo de conexões que este pool de conexão pode ocupar. Quando o número de conexões solicitadas pelo aplicativo do pool de conexão excede o número máximo de conexões, essas solicitações serão adicionadas ao fila de espera.

O pool de conexão de banco de dados de JDBC é representado por javax.sql.DataSource. DataSource é apenas uma interface. A interface é geralmente implementada pelo servidor (Weblogic, WebSphere, Tomcat). Existem também algumas organizações de código aberto que fornecem implementação:

  • Pool de conexão de banco de dados DBCP
  • Pool de conexão de banco de dados C3P0

DataSource é normalmente chamado de fonte de dados, que inclui duas partes: pool de conexão e gerenciamento de pool de conexão. É comum chamar DataSource como pool de conexão.
DataSource é usado para substituir DriverManager para obter Connection, que é rápido e pode melhorar muito o acesso ao banco de dados. Rapidez.
Fonte de dados DHCP

DBCP é uma implementação de pool de conexão de código aberto na Apache Software Foundation. Este pool de conexão depende de outro sistema de código aberto nesta organização: Common-pool. Se você deseja usar esta implementação de pool de conexão, deve adicionar os dois arquivos jar a seguir ao o sistema:
Commons -dbcp.jar: a realização do pool de conexão
Commons-pool.jar: o pool de conexão da biblioteca dependente
Tomcat realizado pelo pool de conexão é realizado por este pool de conexão. O pool de conexão do banco de dados pode ser usado em combinação com o servidor de aplicativos ou pode ser usado independentemente pelo aplicativo.

A fonte de dados é diferente da conexão de banco de dados, não há necessidade de criar várias fontes de dados, é a fábrica que gera a conexão de banco de dados, portanto, toda a aplicação só precisa de uma fonte de dados.
Quando o acesso ao banco de dados termina, o programa ainda fecha a conexão do banco de dados como antes: conn.close (); Mas o código acima não fecha a conexão física ao banco de dados, ele apenas libera a conexão do banco de dados e a retorna para a conexão do banco de dados piscina.

Existem duas maneiras de criar conexões de banco de dados para os dois pools de conexão

public class DataSourceTest {
    
    
	
	//使用 C3P0 方式二:
	@Test
	public void test4() throws SQLException{
    
    
		DataSource ds = new ComboPooledDataSource("helloc3p0");
		
		Connection conn = ds.getConnection();
		
		System.out.println(conn);
	}
	
	//使用 C3P0 方式一:
	@Test
	public void test3() throws Exception{
    
    
		ComboPooledDataSource cpds = new ComboPooledDataSource();
		cpds.setDriverClass("com.mysql.jdbc.Driver");
		cpds.setJdbcUrl("jdbc:mysql://127.0.0.1:3306/test");
		cpds.setUser("root");
		cpds.setPassword("123456");
	 
		Connection conn = cpds.getConnection();
		
		System.out.println(conn);
	}
	
	//使用 DBCP 方式二:
	@Test
	public void test2() throws Exception{
    
    
		Properties pros = new Properties();
		pros.load(DataSourceTest.class.getClassLoader().getResourceAsStream("dbcp.properties"));
		
		DataSource ds = BasicDataSourceFactory.createDataSource(pros);
		
		Connection conn = ds.getConnection();
		
		System.out.println(conn);
	}
	
	//使用 DBCP 方式一:
	@Test
	public void test1() throws SQLException{
    
    
		BasicDataSource bds = new BasicDataSource();
		bds.setDriverClassName("com.mysql.jdbc.Driver");
		bds.setUrl("jdbc:mysql://127.0.0.1:3306/test");
		bds.setUsername("root");
		bds.setPassword("123456");
		
		bds.setInitialSize(10);
		bds.setMaxActive(10);
		
		Connection conn = bds.getConnection();
		
		System.out.println(conn);
		
		//将连接放回到连接池中
		conn.close();
	}
 
}

Usar o segundo c3p0 requer um arquivo de configuração (é claro, você também pode usar um arquivo de propriedade), e o nome do arquivo de configuração deve ser c3p0-config.xml, porque a camada inferior do fabricante do banco de dados encapsula dados com base na chave valor, por isso será baseado nesta chave. Para realizar a leitura de correspondência, ele deve ser colocado sob o caminho de src, porque a leitura é realizada por meio de um carregador de classes. O uso de dhcp no segundo método requer um arquivo de propriedade que é quase o mesmo que o arquivo de propriedade de jdbc, então não vou repeti-lo.

c3p0-config.xml

<c3p0-config>
  <named-config name="helloc3p0"> 
  
  	<!-- 连接数据库的四个字符串 -->
  	<property name="driverClass">com.mysql.jdbc.Driver</property>
  	<property name="jdbcUrl">jdbc:mysql://127.0.0.1:3306/test</property>
  	<property name="user">root</property>
  	<property name="password">123456</property>
  
  	<!-- 若连接池满了一次增长几个 -->
    <property name="acquireIncrement">5</property>
    
    <!-- 连接池初始大小 -->
    <property name="initialPoolSize">10</property>
    
    <!-- 连接池中最小连接数 -->
    <property name="minPoolSize">5</property>
    
    <!-- 连接池中最大连接数 -->
    <property name="maxPoolSize">10</property>
 
	<!-- 整个连接池中最多管理的 Statement 的个数 -->
    <property name="maxStatements">10</property> 
    
    <!-- 连接池中每个连接最多管理的 Statement 的个数 -->
    <property name="maxStatementsPerConnection">2</property>
 
  </named-config>
</c3p0-config>

Nota: O nome do arquivo de configuração deve ser consistente com os parâmetros a serem passados ​​em DataSource ds = new ComboPooledDataSource ("helloc3p0");

Acho que você gosta

Origin blog.csdn.net/WA_MC/article/details/113526437
Recomendado
Clasificación