DBCP(DataBase connection pool)是 apache 上的一个 java 连接池项目,也是 tomcat 默认使用的连接池组件,所以还是相当重要的,有必要学习一下。
准备工作,建立DBCP数据库连接池需要先导入四个包
commons-dbcp2-2.1.1.jar,commons-pool2-2.4.2.jar,commons-logging-1.2.jar,mysql-connector-java-5.1.45.jar
包导好之后,便是properties文件的配置,下边给出了配置的详细属性
driverClassName=com.mysql.jdbc.Driver // 不多解释,这是基本的驱动加载
url=jdbc:mysql://localhost/db_student // 驱动注册
username=root //要连接的数据库用户名
password=root // 要连接的数据库密码
defaultAutoCommit=true:// 设置是否自动提交,默认为true
defaultReadOnly=false: // 是否为只读 默认为false
defaultTransactionIsolation=3:// 设置数据库的事务隔离级别默认为1,READ_UNCOMMITTED,推荐设置为3
initialSize=10: // 初始化数据池拥有的连接数量
maxActive=20: /池中最多可容纳的活着的连接数量,当达到这个数量不在创建连接
maxIdle=20: // 最大空闲等待,也就是连接等待队列超过这个值会自动回收未使用的连接,直到达到20
minIdle=5: // 最小空闲等待 ,数据池中最少保持的连接
maxWait=10000 // 最大等待时间,超过这个时间等待队列中的连接就会失效
testOnBorrow=true //从池中取出连接时完成校验 ,验证不通过销毁这个connection,默认为true,
testOnReturn=false //放入池中时完成校验,默认我fasle
validationQuery=select 1 // 校验语句,必须是查询语句,至少查询一列,设置了它onBorrow才会生效
validationQueryTimeout=1 // 校验查询时长,如果超过,认为校验失败
testWhileIdle=false // 清除一个连接时是否需要校验
timeBetweenEvictionRunsMillis=1 // DBCP默认有个回收器Eviction,这个为设置他的回收时间周期
numTestsPerEvictionRun=3 // Eviction在运行时一次处理几个连接
poolPreparedStatements=true //是否缓存PreparedStatements
maxOpenPreparedStatements=1 // 缓存PreparedStatements的最大个数
文件配置好之后,就可以新建连接池了,有两种方式,先介绍软编码使用连接池
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;
import java.util.Properties;
import org.apache.commons.dbcp2.BasicDataSource;
import org.apache.commons.dbcp2.BasicDataSourceFactory;
public class Mydbcp {
// 声明一个DataSource源,也就是驱动
static BasicDataSource bs = null;
// properties集合,读取properties文件
static Properties properties = new Properties();
static {
// 用类加载器加载文件获得流
InputStream rs = Mydbcp.class.getClassLoader().getResourceAsStream("dbcp.properties");
try {
// 加载文件配置内容到集合中
properties.load(rs);
// 通过basic工厂获得DataSource源,也就是驱动,相当于注册
bs = BasicDataSourceFactory.createDataSource(properties);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String[] args) {
try {
// 来个for循环测试配置是否正确
for (int i = 0; i < 50; i++) {
// 从数据池中取出连接
Connection connection = bs.getConnection();
// System.out.println(bs.getMaxTotal());
// 使用完毕将连接放回数据池(这里是代理过的close方法,并不是JDBC原生的close)
connection.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
硬编码使用连接池
这种方法比较麻烦,需要一步一步的设置配置,远不如properties配置文件方便,而且耦合还高,不推荐使用
import java.sql.Connection;
import java.sql.SQLException;
import org.apache.commons.dbcp2.BasicDataSource;
public class Mydbcp {
// 声明DBCP
static BasicDataSource bds = new BasicDataSource();
static {
// 一步一步设置配置,根据需求自主设置,只需set对应的属性就可以
bds.setDriverClassName("com.mysql.jdbc.Driver");
bds.setUrl("jdbc:mysql://localhost/db_student");
bds.setUsername("root");
bds.setPassword("root");
bds.setInitialSize(5);
bds.setMaxTotal(20);
bds.setMaxIdle(20);
bds.setMinIdle(5);
bds.setMaxWaitMillis(10000);
}
public static void main(String[] args) {
try {
// for循环测试连接是否成功
for(int i = 0; i < 50; i++) {
Connection conn = bds.getConnection();
System.out.println(conn.hashCode()+ "...." + i);
conn.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
一些常见的问题:配置properties文件时需要注意,属性值不能用双引号括起来,每一行不需要加分号,每行不能有多语的空格,还有properties要放在src目录下。
正确示范
错误示范