DBCP数据池的properties文件详细配置以及简单的实现(连接mysql)

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目录下。

正确示范

错误示范

你可能感兴趣的:(DBCP数据池的properties文件详细配置以及简单的实现(连接mysql))