DBCP (DatabaseConnection Pool)是Apache放下的一个依赖Jakarta commons-pool对象池机制的数据库连接池,Tomcat的数据源使用的就是DBCP。目前 DBCP有两个版本分别是1.3和1.4,其中:1.3版本对应的是JDK 1.4~1.5和JDBC 3,而1.4版本对应JDK 1.6和JDBC4,这两个功能上倒是没有什么区别。
使用DBCP会用到commons-dbcp.jar
和commons-pool.jar
两个包。
DBCP的工作原理是,程序首先会初始化相应的数据库连接池,以供程序访问,当某个操作需要访问数据库时,程序会首先在连接池中取得空闲连接,如没有空闲连接在创建,用完之后归还连接池,这样达到了连接的重利用,不用频繁的创建连接和销毁,从而优化程序。
DBCP常见属性有:
第一步:创建项目在其中导入mysql的驱动以及DBCP相关的jar文件,然后在项目类路径下创建一个名为dbcpcfg.properties的DBCP配置文件,具体信息如下:
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/book?useSSL=true&serverTimezone=UTC&characterEncoding=utf8
username=root
password=root
initialSize=4
maxActive=6
maxIdle=5
minIdle=2
maxWait=6000
第二步:创建DBCP工具类,具体代码如下:
public class DBUtil {
private static DataSource dataSource;
private DBUtils() {
}
static{
try {
InputStream in = DBCPUtil.class.getClassLoader()
.getResourceAsStream("dbcpcfg.properties");//读取配置文件,初始化数据源
Properties props = new Properties();
props.load(in);
dataSource = BasicDataSourceFactory.createDataSource(props);
} catch (Exception e) {
throw new ExceptionInInitializerError(e);
}
}
public static DataSource getDataSource(){
return dataSource;
}
public static Connection getConnection(){
try {
return dataSource.getConnection();
} catch (SQLException e) {
throw new RuntimeException("get database connection failed");
}
}
}
第三步:提供测试代码:
public static void main(String[] args) {
for(int i =0;i<8;i++) {
Connection conn = DBUtil.getConnection();
System.out.println(i+": "+conn);
try {
// conn.close(); // ------ ①
} catch (SQLException e) {
e.printStackTrace();
}
}
}
运行测试代码,当将编号①处的代码注释起来时,在控制台中输出6个Connection,过了一会(大约6秒)程序报错关闭,如下图14.8所示;当让编号①处的代码执行时,程序会在控制台上输出10个Connection对象。
public static DataSource getDataSource() throws Exception {
Properties props = new Properties();
InputStream is = DBUtil.class.getClassLoader()
.getResourceAsStream("dbcpcfg.properties");
props.load(is);
DataSource ds = BasicDataSourceFactory.createDataSource(props);
return ds;
}
public static void main(String[] args) throws Exception {
for (int i = 0; i < 3000; i++) {
DataSource ds = getDataSource();
System.out.println(i + ": " + ds.hashCode());
}
}