JDBC之数据库连接池(DBCP和C3P0)

JDBC 的数据库连接池使用 javax.sql.DataSource 来表示,DataSource 只是一个接口,该接口通常由服务器(Weblogic, WebSphere, Tomcat)提供实现,也有一些开源组织提供实现:

  • DBCP 数据库连接池
  • C3P0 数据库连接池

DataSource 通常被称为数据源,它包含连接池和连接池管理两个部分,习惯上也经常把 DataSource 称为连接池

  1. DBCP 是 Apache 软件基金组织下的开源连接池实现,该连接池依赖该组织下的另一个开源系统:Common-pool. 如需使用该连接池实现,应在系统中增加如下两个 jar 文件:
  • Commons-dbcp.jar:连接池的实现
  • Commons-pool.jar:连接池实现的依赖库
    Tomcat 的连接池正是采用该连接池来实现的。该数据库连接池既可以与应用服务器整合使用,也可由应用程序独立使用。
    使用例子如下:

	/**
	 * 使用DBCP数据库连接池
	 * 1. 加入jar包 . 依赖于DBCP.jar pool.jar
	 * 2. 创建数据库连接池
	 * 3. 为数据源实例设置必须的属性
	 * 4. 从数据源中获取数据库连接
	 * @throws Exception 
	 */
	@Test
	public void testDBCP() throws Exception {
		BasicDataSource dataSource = null;
		//1. 创建 DBCP 数据源实例
		dataSource = new BasicDataSource();
		
		//2. 为数据源实例指定必须的属性
		dataSource.setUsername("root");
		dataSource.setPassword("123");
		dataSource.setUrl("jdbc:mysql://localhost:3366/jdbctest");
		dataSource.setDriverClassName("com.mysql.jdbc.Driver");
		
		//3. 指定数据源的一些可选的属性
		//1). 指定数据库连接池中的初始化连接数的个数
		dataSource.setInitialSize(10);
		
		//2). 指定最大的连接数 : 同一时刻可以同时向数据库申请的连接数
		dataSource.setMaxActive(20);
		
		//3). 指定小连接数 : 在数据库连接池空闲状态下 , 连接池中最少有多少个连接.
		dataSource.setMinIdle(5);
		
		//4). 等待数据库连接池分配链接的最长时间 . 单位:ms . 超出该时间将抛出异常 . 
		dataSource.setMaxWait(2000);
		//4. 从数据源中获取数据库连接
		Connection connection = dataSource.getConnection();
		System.out.println(connection);
	}
	//运行结果 : jdbc:mysql://localhost:3366/jdbctest, UserName=root@localhost, MySQL Connector Java

使用配置文件创建数据库连接池的案例如下:

/**
	 * 1. 加载 DBCP 的 properties 配置文件 : 配置文件来自 BasicDataSourceFactory 的属性
	 * 2. 调用 BasicDataSourceFactory 的 createDataSource(properties)
	 * 3. 从 DataSource 实例中获取数据库连接
	 * @throws Exception
	 */
	@Test
	public void testDBCPWithDataSourceFactory() throws Exception {
		Properties properties = new Properties();
		InputStream inStream = JDBCTest2.class.getClassLoader().getResourceAsStream("dbcp.properties");
		properties.load(inStream);
		DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);
	
		System.out.println(dataSource.getConnection());
		
	}
-----------------------------------------------------------------------------------------------------
dbcp.properties
username = root
password = 123
url= jdbc:mysql://localhost:3366/jdbctest
driverClassName = com.mysql.jdbc.Driver
initialSize = 10
maxActive = 60
minIdle = 5
maxWait =1000

注意:

  1. 数据源和数据库连接不同,数据源无需创建多个,它是产生数据库连接的工厂,因此整个应用只需要一个数据源即可。
  2. 当数据库访问结束后,程序还是像以前一样关闭数据库连接:conn.close(); 但上面的代码并没有关闭数据库的物理连接,它仅仅把数据库连接释放,归还给了数据库连接池。

第二种: C3P0 数据源
例子如下:

/**
	 * 1. 创建c3p0-config.xml 文件,参考index.xml中的内容
	 * 2. 创建 ComboPooledDataSource 实例 :
	 * DataSource dataSource = new ComboPooledDataSource("helloc3p0"); 
	 * 3. 从 DataSource 实例中获取数据库连接 .
	 * @throws Exception
	 */
	 @Test
	public void testC3p0WithConfigFile() throws Exception {
		DataSource dataSource = new ComboPooledDataSource("helloc3p0"); 
		
		System.out.println(dataSource.getConnection());
		
		ComboPooledDataSource comboPooledDataSource = (ComboPooledDataSource) dataSource;
		System.out.println(comboPooledDataSource.getMaxStatements());
	}
	------------------------------------------------------------------------------------------
<c3p0-config>

	<named-config name="helloc3p0">
	
	<!-- 指定连接数据源的基本属性 -->>
	<property name = "user">root</property>
	<property name = "password">123</property>
	<property name = "driverClass">com.mysql.jdbc.Driver</property>
	<property name = "jdbcUrl">jdbc:mysql://localhost:3366/jdbctest</property>
	
		<!-- 若数据库中连接数不足时,一次向数据库服务器中申请的连接数 -->
		<property name="acquireIncrement">5</property>
		<!-- 初始化数据库连接池时连接的数量 -->
		<property name="initialPoolSize">5</property>
		<!-- 数据库连接池中的最小的数据库连接数 -->
		<property name="minPoolSize">5</property>
		<!-- 数据库连接池中的最大的数据库连接数 -->
		<property name="maxPoolSize">10</property>

		<!-- C3P0 数据库连接池可以维护的 Statement 的个数 -->
		<property name="maxStatements">20</property>
		<!-- 每个连接同时可以使用的 Statement 对象的个数 -->>
		<property name="maxStatementsPerConnection">5</property>
	</named-config>
		
</c3p0-config>

猜你喜欢

转载自blog.csdn.net/weixin_37590761/article/details/86495514