Apache Commons DBCP数据库连接池使用

简介

    在系统中, 数据库连接是一种昂贵的资源。在很多用户方的系统中体现尤为突出。数据库连接的管理甚至能够影响到系统的性能。数据库连接池负责分配、管理和释放数据库连接,它允许数据库连接重复使用,同时可以设置一些参数来控制连接信息。数据库连接池不仅提升了资源的利用率,而且对数据库的连接进行了限制,还可以保护数据库系统。

关键的配置信息

最小空闲连接数(minIdle):激活连接的最小数量能够在池中保留空闲。
初始化连接数(initialSize):当连接池启动完,初始化连接数量被创建。
最大空闲连接数(maxIdle):最大连接数量能够在池中保留,如果这个值在负载很高的系统中设置的太低,你将会看到连接关闭,立刻创建新的连接被打开。这是由于激活线程暂时关闭连接的速度比打开连接要快的,导致空闲连接增长大于maxIdle。
最大等待时间(maxWaitMillis):池在抛出异常之前(当没有可用连接时)等待返回连接的最大毫秒数,或者<= 0无限期等待。

使用

Maven依赖

        <dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-dbcp2</artifactId>
            <version>2.6.0</version>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.38</version>
        </dependency>
public class DBCPTest {

    public static void main(String[] args) {
        Properties properties = new Properties();

        InputStream is = DBCPTest.class.getClassLoader().getResourceAsStream("config/dbcp.properties");
        BasicDataSource basicDataSource = null;
        Connection connection = null;
        try {
            properties.load(is);
            basicDataSource = BasicDataSourceFactory.createDataSource(properties);
            basicDataSource.setInitialSize(2);
            basicDataSource.setMaxIdle(10);
            basicDataSource.setMinIdle(1);
            basicDataSource.setMaxWaitMillis(2000);     
            connection = basicDataSource.getConnection();
            String sql = "select id, username from users";
            PreparedStatement statement = connection.prepareStatement(sql);
            ResultSet resultSet = statement.executeQuery();
            while (resultSet.next()) {
                System.out.println(resultSet.getInt("id") + " : " + resultSet.getString("username"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            if(connection != null){
               try {
                   connection.close();
               } catch (SQLException e) {
                   e.printStackTrace();
               }
           }
        }
    }
}
添加新评论