数据库连接池--概述以及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.Driver
url=jdbc:mysql://localhost:3306/day17
username=root
password=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, SERIALIZABLE
defaultTransactionIsolation=READ_UNCOMMITTED

 

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。