一、数据库连接池
我们知道,在开发基于数据库的Web程序时,对数据库进行操作时,传统的步骤为:①在主程序中建立数据库连接,②进行SQL操作③释放数据库连接,但是这种传统的方法存在着一些问题,其中最显著的问题就是当每次需要数据库连接的时候,就会向数据库申请建立一个连接,等到执行完操作之后就会释放这个连接,这样的话每次访问数据库都会消耗一定的时间,当频繁的进行数据库的连接操作时,就会占用很多资源,而数据库的连接资源也没有得到很好的利用,而这种方法也不能够控制创建的连接对象数,容易导致内存泄漏。
因此,为了解决这些问题,可以采用数据库连接池,其主要思想就是数据库连接建立一个缓冲池,先在这个缓冲池中放入一定数量的连接(放入数量由开发人员来指定),当需要建立数据库连接的时候,只需要从缓冲池中取出一个连接,使用完成之后再放回去即可,因此,数据库连接池就是负责分配,管理何释放数据库连接的一个工具,它使得应用程序在需要时可以重复使用一个现有的数据库连接,而不需要重新建立一个新的连接。
JDBC中的数据库连接池用javax.sql.DataSource来表示,DataSource叫做数据源,它包含了连接池和连接池管理两个部分,通常也把它叫做连接池。它只是一个接口,而该接口的实现通常是由服务器或者一些开源组织实现,如DBCP数据库连接池,下面来介绍以下DBCP连接池
二、DBCP数据源
DBCP是阿帕奇(apache)提供的一个开源的连接池实现,该连接池还依赖于apache下的另一个开源系统:Commom pool,如果想要使用DBCP连接池,需要去apache官网去下载DBCP以及pool的jar包来将其加入到项目中,下载地址为
下面是一个实例利用数据库连接池来建立数据库连接,其中有两个方法,一个是耦合的方法,一个是通用的方法:
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;
import javax.sql.DataSource;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
import org.junit.Test;
public class DataSource_Test {
/**
* 使用DBPC数据库连接池连接数据库
* 步骤:
* 1、导入commons pool2 jar包与commons dbcp2 jar包
* 2、创建数据库连接池(数据源实例)
* 3、将连接数据库必要的属性作为参数传入到数据源中指定的方法中
* 4、从数据源获取数据库连接
* @throws SQLException
*/
@Test
public void TestDBCP() throws SQLException{
BasicDataSource dataSource = null;
//1、创建数据源实例
dataSource = new BasicDataSource();
//2、传入必要的连接数据库的参数
dataSource.setUsername("root");
dataSource.setPassword("090936");
dataSource.setUrl("jdbc:mysql://localhost:3306/test");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
//3、传入可选的参数
dataSource.setMaxTotal(5);//指定同一时刻可以向数据库连接池中申请的最大连接数
dataSource.setInitialSize(5);//指定数据库连接池中初始化连接数的个数
dataSource.setMinIdle(2);//指定在数据库连接池中保存的最少的空闲连接的数量
dataSource.setMaxWaitMillis(5000);//设定等待数据库连接池分配连接的最长时间(以毫秒为单位),超出改时间则抛出异常
//3、从数据源获取数据库连接
Connection con = dataSource.getConnection();
System.out.println(con);
}
/**
* 使用DBCP数据库连接池编写通用的连接数据库的方法
* 1、创建一个名为"dbcp.properties"的文件,里面存入连接数据库所需的信息,其中的键应该来自BasicDataSource中的属性
* 2、加载"dbcp.properties"文件
* 3、调用BasicDataSourceFactory中的createSource()方法创建DataSource
* 4、从DataSource中获取数据库连接
* @throws Exception
*/
@Test
public void TestDBCP2() throws Exception{
Properties properties = new Properties();
InputStream in = DataSource_Test.class.getClassLoader().getResourceAsStream("dbcp.properties");
properties.load(in);//加载dbcp.properties文件
DataSource dataSource = BasicDataSourceFactory.createDataSource(properties);//创建数据源
Connection con = dataSource.getConnection();//获取数据库连接
System.out.println(con);
}
}