DBCP连接池

Posted 海之浪子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了DBCP连接池相关的知识,希望对你有一定的参考价值。

 1、DBCP连接池

  1.1 DBCP也是一个开源的连接池,是Apache Common成员之一,tomcat内置连接池

  db.properties文件

driver=com.mysql.jdbc.Driver
url=jdbc:mysql://localhost:3306/web?useUnicode=true&characterEncoding=utf8
username=root
password=root

 

  DBCPUtils.java代码

package com.rookie.bigdata.utils;

import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author
 * @date 2019/1/13
 */
public class DBCPUtils {
    private static DataSource dataSource;

    static {
        //加载配置文件
        InputStream resourceAsStream = DBCPUtils.class.getClassLoader().getResourceAsStream("db.properties");

        try {
            //使用Properties处理输入流
            Properties properties = new Properties();
            properties.load(resourceAsStream);
            //创建数据源
            dataSource = BasicDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public static DataSource getDataSource() {

        return dataSource;
    }

    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw  new RuntimeException(e);
        }
    }

}

 

 测试代码

  

package com.rookie.bigdata.utils;

import org.junit.Test;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;


/**
 * @author
 * @date 2019/1/13
 */
public class DBCPUtilsTest {
    @Test
    public void test1() throws SQLException {
        Connection connection = DBCPUtils.getConnection();

        String sql="insert into H_USER values(?,?,?)";
        PreparedStatement preparedStatement = connection.prepareStatement(sql);

        preparedStatement.setInt(1,4);
        preparedStatement.setString(2,"lisi");
        preparedStatement.setInt(3,24);

        int i = preparedStatement.executeUpdate();
        System.out.println(i);


    }

}

 

连接池配置属性

  

initialSize  

     初始化连接,连接池启动时创建的初始化连接数量(默认值为0)

maxActive  
     最大活动连接,连接池中可同时连接的最大的连接数(默认值为8)

minIdle 
     最小空闲连接,连接池中最小的空闲的连接数,低于这个数量会被创建新的连接(默认为0,该参数越接近maxIdle,性能越好,因为连接的创建和销毁,都是需要消耗资源的;但是不能太大,因为在机器很空闲的时候,也会创建低于minidle个数的连接,类似于jvm参数中的Xmn设置)

maxIdle   
     最大空闲连接,连接池中最大的空闲的连接数,超过的空闲连接将被释放,如果设置为负数表示不限制(默认为8个,maxIdle不能设置太小,因为假如在高负载的情况下,连接的打开时间比关闭的时间快,会引起连接池中idle的个数上升超过maxIdle,而造成频繁的连接销毁和创建,类似于jvm参数中的Xmx设置)

maxWait 
     从池中取连接的最大等待时间,单位ms.当没有可用连接时,连接池等待连接释放的最大时间,超过该时间限制会抛出异常,如果设置-1表示无限等待(默认为无限)

validationQuery 
     验证使用的SQL语句

testWhileIdle    
     指明连接是否被空闲连接回收器(如果有)进行检验.如果检测失败,则连接将被从池中去除.

testOnBorrow    
     借出连接时不要测试,否则很影响性能。一定要配置,因为它的默认值是true。false表示每次从连接池中取出连接时,不需要执行validationQuery = "SELECT 1" 中的SQL进行测试。若配置为true,对性能有非常大的影响,性能会下降7-10倍。

timeBetweenEvictionRunsMillis
     每30秒运行一次空闲连接回收器,配置timeBetweenEvictionRunsMillis = "30000"后,每30秒运行一次空闲连接回收器(独立线程)。并每次检查3个连接,如果连接空闲时间超过30分钟就销毁。销毁连接后,连接数量就少了,如果小于minIdle数量,就新建连接,维护数量不少于minIdle,过行了新老更替。

minEvictableIdleTimeMillis
     池中的连接空闲30分钟后被回收

numTestsPerEvictionRun
     在每次空闲连接回收器线程(如果有)运行时检查的连接数量

removeAbandoned
     连接泄漏回收参数,当可用连接数少于3个时才执行

removeAbandonedTimeout
     连接泄漏回收参数,180秒,泄露的连接可以被删除的超时值

 

具体可以参考官网:http://commons.apache.org/proper/commons-dbcp/configuration.html

 

以上是关于DBCP连接池的主要内容,如果未能解决你的问题,请参考以下文章

[转]MySQL连接池配置详解(DBCP)

如何跟踪/记录 tomcat dbcp 池中的连接并检测不返回连接池的代码

c3p0,dbcp与druid 三大连接池的区别[转]

数据库连接池DBCP的使用

DBCP数据库连接池的简单使用

DBCP数据库连接池的简单使用