前言
首先说一下什么是druid,druid是阿里开源的一个数据库连接池(类似于C3P0),其在监控、可扩展性、稳定性和性能方面具有明显的优势,尤其是提供了可视化的监控页面可以展示数据库慢查询的记录等,可以说是非常良心了。这里虽然说是druid的配置,但其实里面包括了数据库的相关配置了,配置完就可以连接并使用数据库了。
依赖引入
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.10</version>
</dependency>
druid官方推荐的使用方式是引入druid-spring-boot-starter
包,引入后无需再引入druid
的包,starter已经自动对druid
包进行了依赖。当然也可以只引入druid
包,然后通过自己创建DruidDataSource
的方式配置,但这样做复杂程度太高了,非常不推荐。
文件配置
公司的项目中使用的是yml格式的配置,配置如下,其中最重要的就是url
、username
、password
和driver-class-name
,如果对性能方面没有要求的话其他值都可以不配,系统会采用默认值。
spring:
datasource:
druid:
url: jdbc:mysql://ip:port/gserver?characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull
username: user
password: pwd
# 数据库连接驱动
driver-class-name: com.mysql.jdbc.Driver
# 初始化时建立物理连接的个数
initial-size: 5
# 最大连接池数量
max-active: 20
# 最小连接池数量
min-idle: 5
# 获取连接时最大等待时间
max-wait: 60000
# 是否缓存preparedStatement,也就是PSCache。
pool-prepared-statements: false
# 要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。
max-pool-prepared-statement-per-connection-size: -1
# 用来检测连接是否有效的sql,要求是一个查询语句,常用select 'x'。
validation-query: SELECT 'x'
# 单位:秒,检测连接是否有效的超时时间。
validation-query-timeout: 1
# 申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
test-on-borrow: false
# 归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。
test-on-return: false
# 建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。
test-while-idle: true
# 有两个含义:1) Destroy线程会检测连接的间隔时间,如果连接空闲时间大于等于minEvictableIdleTimeMillis则关闭物理连接。2) testWhileIdle的判断依据,详细看testWhileIdle属性的说明
time-between-eviction-runs-millis: 6000
# 连接保持空闲而不被驱逐的最小时间
min-evictable-idle-time-millis: 1800000
# 监控页面相关配置
stat-view-servlet:
url-pattern: /druid/*
login-username: admin
login-password: admin
# filter相关配置
filter:
stat:
slow-sql-millis: 1000
log-slow-sql: true
enabled: true
log4j:
enabled: true
result-set-log-enabled: false
connection-log-enabled: false
statement-parameter-clear-log-enable: false
statement-close-after-log-enabled: false
statement-create-after-log-enabled: false
statement-parameter-set-log-enabled: false
statement-prepare-after-log-enabled: false
配置数据获取接口
配置完以后可以通过接口来查看生效的参数,接口示例如下:
@RestController
public class DruidStatController {
@GetMapping("/durid/stat")
public Object druidStat(){
// DruidStatManagerFacade#getDataSourceStatDataList 该方法可以获取所有数据源的监控数据,除此之外 DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。
return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
}
}
下面列出的就是调用接口返回的参数及格式:
[
{
"Identity": 2136298280,
"Name": "DataSource-2136298280",
"DbType": "mysql",
"DriverClassName": "com.mysql.jdbc.Driver",
"URL": "jdbc:mysql://ip:port/gserver?characterEncoding=utf-8&allowMultiQueries=true&zeroDateTimeBehavior=convertToNull",
"UserName": "user",
"FilterClassNames": [
"com.alibaba.druid.filter.logging.Log4jFilter",
"com.alibaba.druid.filter.stat.StatFilter"
],
"WaitThreadCount": 0,
"NotEmptyWaitCount": 1,
"NotEmptyWaitMillis": 0,
"PoolingCount": 1,
"PoolingPeak": 1,
"PoolingPeakTime": 1535696830579,
"ActiveCount": 0,
"ActivePeak": 1,
"ActivePeakTime": 1535696830579,
"InitialSize": 0,
"MinIdle": 0,
"MaxActive": 20,
"QueryTimeout": 0,
"TransactionQueryTimeout": 0,
"LoginTimeout": 0,
"ValidConnectionCheckerClassName": "com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker",
"ExceptionSorterClassName": "com.alibaba.druid.pool.vendor.MySqlExceptionSorter",
"TestOnBorrow": true,
"TestOnReturn": true,
"TestWhileIdle": true,
"DefaultAutoCommit": true,
"DefaultReadOnly": null,
"DefaultTransactionIsolation": null,
"LogicConnectCount": 1,
"LogicCloseCount": 1,
"LogicConnectErrorCount": 0,
"PhysicalConnectCount": 1,
"PhysicalCloseCount": 0,
"PhysicalConnectErrorCount": 0,
"ExecuteCount": 1,
"ExecuteUpdateCount": 0,
"ExecuteQueryCount": 0,
"ExecuteBatchCount": 0,
"ErrorCount": 0,
"CommitCount": 0,
"RollbackCount": 0,
"PSCacheAccessCount": 0,
"PSCacheHitCount": 0,
"PSCacheMissCount": 0,
"StartTransactionCount": 0,
"TransactionHistogram": [
0,
0,
0,
0,
0,
0,
0
],
"ConnectionHoldTimeHistogram": [
0,
0,
1,
0,
0,
0,
0,
0
],
"RemoveAbandoned": false,
"ClobOpenCount": 0,
"BlobOpenCount": 0,
"KeepAliveCheckCount": 0,
"KeepAlive": false,
"FailFast": false,
"MaxWait": -1,
"MaxWaitThreadCount": -1,
"PoolPreparedStatements": false,
"MaxPoolPreparedStatementPerConnectionSize": 10,
"MinEvictableIdleTimeMillis": 1800000,
"MaxEvictableIdleTimeMillis": 25200000,
"LogDifferentThread": true,
"RecycleErrorCount": 0,
"PreparedStatementOpenCount": 1,
"PreparedStatementClosedCount": 1,
"UseUnfairLock": false,
"InitGlobalVariants": false,
"InitVariants": false
}
]
管理页面
服务启动后,可以通过http://127.0.0.1:端口/服务名/druid/login.html来登录管理页面
druid-index.png
可以看到druid的监控功能还是很丰富的,尤其是SQL监控这块,可以排查一些慢查询的问题(相关配置项在在spring.datasource.druid.filter.stat中),对于没有完善监控手段的小系统来说非常实用。
网友评论