首页 > 代码库 > 数据库连接池--概述以及DBCP实现

数据库连接池--概述以及DBCP实现

1. 为什么要引入数据库连接池

  应用程序直接获取连接的方式中,用户每次请求都需要向服务器获得连接,而服务器创建连接通常需要消耗相对较大的资源,创建时间也较长.假设网站一天10万的访问量,数据库服务器就需要创建10万次连接,极大的浪费数据库服务器的资源,并且极易造成数据库服务器内存溢出,宕机.

2.  开源的数据库连接池

  数据库连接池必须实现javax.sql.DataSource接口,并提供getConnection()方法.

  DBCP 数据库连接池

    是Apache软件基金会组织下的开源连接池的实现,使用DBCP数据源,应用程序应在系统中引入如下两个jar文件:

    Commoms-dbcp.jar:连接池的实现

    Commons-pool.jar:连接池实现的依赖

    Tomcat的连接池正是采用该连接池实现的.该数据库连接池既可以与应用服务器整合应用,也可以由程序独立使用.

  DBCP的核心类是BasicDataSource

  下面使用两种方式演示使用BasicDataSource从数据库获取连接池的方法.注意需要在工程项目中导入JDBC的jar包,保证可以获得数据库连接

  第一种,在BasicDataSource类对象初始化时通过BasicDataSource自身的API对数据库连接以及连接池的一些属性进行设置.

import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSource;public class DBCPUtils {	private static BasicDataSource dataSource = new BasicDataSource();	static{		//以下是创建数据库连接的基本设置		//类似于JDBC连接中注册驱动--->Class.forName("com.mysql.jdbc.Driver");		dataSource.setDriverClassName("com.mysql.jdbc.Driver");		//设置JDBC中用于获取连接的参数--->Connection conn = DriverManager.getConnection(url,username,password);		dataSource.setUrl("jdbc:mysql://localhost:3306/day17");		dataSource.setUsername("root");		dataSource.setPassword("fujianyi");				//以下是数据库连接池的设置		//设置数据库连接池的初始化连接数		dataSource.setInitialSize(10);		//设置数据库连接池的最大活动数,数据库服务器所能承受的最大连接数		dataSource.setMaxActive(20);		//设置数据库连接池在空闲时保持的最大连接数		dataSource.setMaxIdle(15);		//设置数据库连接池在空闲时保持的最小连接数		dataSource.setMinIdle(5);		}	public static DataSource getDataSource(){		return dataSource;	}}

   第二种,使用BasicDataSourceFactory工厂类创建BasicDataSource连接池,并在创建连接时,将数据库连接以及连接池的属性通过配置文件的方式进行设置.注意在获取配置文件的路径,为当前工程的classpath,也就是src目录下保证配置文件的存在.

import java.io.InputStream;import java.util.Properties;import javax.sql.DataSource;import org.apache.commons.dbcp.BasicDataSourceFactory;public class DBCPUtils2 {	private static DataSource dataSource;	static{		try {			Properties properties = new Properties();			InputStream in = DBCPUtils2.class.getClassLoader().getResourceAsStream("dbcpconfig.properties");			properties.load(in);			dataSource = BasicDataSourceFactory.createDataSource(properties);		} catch (Exception e) {			throw new RuntimeException(e);		}			}	public static DataSource getDataSource(){		return dataSource;	}}

   以下是上述代码引用的配置文件dbcpconfig.properties的内容,里面是一些配置,同第一种方式的配置内容一样.

#连接设置driverClassName=com.mysql.jdbc.Driverurl=jdbc:mysql://localhost:3306/day17username=rootpassword=fujianyi#<!-- 初始化连接 -->initialSize=10#最大连接数量maxActive=50#<!-- 最大空闲连接 -->maxIdle=20#<!-- 最小空闲连接 -->minIdle=5#<!-- 超时等待时间以毫秒为单位 6000毫秒/1000等于60秒 -->maxWait=60000#JDBC驱动建立连接时附带的连接属性属性的格式必须为这样:[属性名=property;] #注意:"user" 与 "password" 两个属性会被明确地传递,因此这里不需要包含他们。connectionProperties=useUnicode=true;characterEncoding=gbk#指定由连接池所创建的连接的自动提交(auto-commit)状态。defaultAutoCommit=true#driver default 指定由连接池所创建的连接的只读(read-only)状态。#如果没有设置该值,则“setReadOnly”方法将不被调用。(某些驱动并不支持只读模式,如:Informix)defaultReadOnly=#driver default 指定由连接池所创建的连接的事务级别(TransactionIsolation)。#可用值为下列之一:(详情可见javadoc。)NONE,READ_UNCOMMITTED, READ_COMMITTED, REPEATABLE_READ, SERIALIZABLEdefaultTransactionIsolation=READ_UNCOMMITTED

 

数据库连接池--概述以及DBCP实现