一、配置
配置 | 缺省值 | 说明 |
---|---|---|
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();
}
}