jdbc · 2021-12-25 0

数据库连接池druid配置

一、配置

配置 缺省值 说明
name 配置这个属性的意义在于,如果存在多个数据源,监控的时候可以通过名字来区分,如果没有配置,将会生成一个名字,格式是:"DataSource-"+System.identityHashCode(this)
url 连接数据库的url,不同数据库不一样。例如:mysql : jdbc:mysql://127.0.0.1:3306/druid_db
username 连接数据库的用户名
password 连接数据库的密码
driverClassName 根据url自动识别,可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName
initialSize 0 初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时
minIdle 0 最小连接数量
maxIdle 8 (已废弃),可使用maxActive
maxActive 8 最大连接数量
maxWait -1 从连接池中获取连接的最大等待时间,单位ms,默认-1,即会一直等待下去
timeBetweenEvictionRunsMillis 60*000 默认值60s,DestroyTask 执行间隔时间。检测需要关闭的空闲连接和长时间没关闭的连接
removeAbandoned false 处理活跃连接,针对连接泄漏问题。是否清除已经超过removeAbandonedTimeout设置的无效连接。建议值:true
logAbandoned false 用于连接泄漏场景,关闭abandonded连接时是否输出错误日志。建议值:true
removeAbandonedTimeoutMillis 300 * 1000 处理活跃连接(未关闭),针对连接泄漏、数据库死锁问题。超过时间限制,回收无用的连接,removeAbandoned 必须为 true。数据库连接的状态:关闭、未关闭(活跃)、在执行(这个值执行前后会设置)。还在执行的连接不会被回收
minEvictableIdleTimeMillis 30 * 60 * 1000 最小检查间隙,一个连接在池中最小生存的时间(结合检查区间来看,闲置时间超过这个时间,才会被丢弃),缺省值30min
maxEvictableIdleTimeMillis 7 * 60 * 60 * 1000 最大检查间隙,一个连接在池中最大生存的时间(无视检查区间,只要闲置时间超过这个时间,就一定会被丢弃),缺省值7h

说明maxIdle已经废弃,用maxActive和minIdle来表示数据库连接池的maxPoolSize和minPoolSize。

二、监控

maven依赖

<!-- mysql -->
<dependency>
  <groupId>mysql</groupId>
  <artifactId>mysql-connector-java</artifactId>
  <version>8.0.15</version>
</dependency>

<!-- druid -->
<dependency>
  <groupId>com.alibaba</groupId>
  <artifactId>druid</artifactId>
  <version>1.2.8</version>
</dependency>

web.xml

  <servlet>
    <servlet-name>druidStatView</servlet-name>
    <servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>druidStatView</servlet-name>
    <url-pattern>/druid/*</url-pattern>
  </servlet-mapping>

三、使用

  • getActiveCount()方法返回了当前正在使用的连接数量,
  • getConnectCount()方法返回了曾经连上与已经连上的连接总数,
  • getPoolingCount()返回了连接池中剩余空闲的连接数量。

创建 DruidDataSource

public static void createDataSource(String name) {
    DruidDataSource dataSource = new DruidDataSource();

    if (name != null) {
        dataSource.setName(name);
    }

    String url = "jdbc:mysql://localhost:3306/druid_db?useUnicode=true&useSSL=false";
    String username = "root";
    String password = "123456";
    String driverClassName = "com.mysql.cj.jdbc.Driver";

    dataSource.setUrl(url);
    dataSource.setUsername(username);
    dataSource.setPassword(password);
    dataSource.setDriverClassName(driverClassName);

    dataSource.setInitialSize(5);
    dataSource.setMinIdle(1);
    dataSource.setMaxActive(10);

    dataSource.setMaxWait(600000);

    // 每 5s (默认 60s) 执行 DestroyTask 任务,DestroyTask 销毁空闲连接和长时间没有关闭的连接
    dataSource.setTimeBetweenEvictionRunsMillis(5000);

    // minEvictableIdleTimeMillis:最小检查间隙,缺省值30min,
    // 官方解释:一个连接在池中最小生存的时间(结合检查区间来看,闲置时间超过这个时间,才会被丢弃)。
    // maxEvictableIdleTimeMillis:最大检查间隙,缺省值7h,
    // 官方解释:一个连接在池中最大生存的时间(无视检查区间,只要闲置时间超过这个时间,就一定会被丢弃)。
    dataSource.setMinEvictableIdleTimeMillis(30000);

    // 连接状态不是 running (执行 afterExecute() 后,running 致为 false),
    // 连接时间大于 removeAbandonedTimeoutMillis,把连接关闭
    dataSource.setRemoveAbandoned(true);
    dataSource.setLogAbandoned(true);
    dataSource.setRemoveAbandonedTimeout(1);

    try {
        dataSource.setFilters("stat");
    } catch (SQLException e) {
        e.printStackTrace();
    }
}