数据库连接池--概述以及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对数据库连接以及连接池的一些属性进行设置.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
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.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目录下保证配置文件的存在.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
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的内容,里面是一些配置,同第一种方式的配置内容一样.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#连接设置
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
|