org.springframework.boot
spring-boot-starter-parent
2.1.3.RELEASE
4.0.0
lab-19-datasource-pool-druid-single
org.springframework.boot
spring-boot-starter-jdbc
com.alibaba
druid-spring-boot-starter
1.1.21
mysql
mysql-connector-java
5.1.48
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-test
test
在application.yml中,添加 Druid 配置,如下:
spring:
# datasource 数据源配置内容,对应 DataSourceProperties 配置属性类
datasource:
url: jdbc:mysql://127.0.0.1:3306/test?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root # 数据库账号
password: # 数据库密码
type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource
# Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性
druid:
min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。
max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。
filter:
stat: # 配置 StatFilter ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
log-slow-sql: true # 开启慢查询记录
slow-sql-millis: 5000 # 慢 SQL 的标准,单位:毫秒
stat-view-servlet: # 配置 StatViewServlet ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
enabled: true # 是否开启 StatViewServlet
login-username: yudaoyuanma # 账号
login-password: javaniubi # 密码
spring.datasource
配置项,设置 Spring 数据源的通用配置。其中,spring.datasource.type
配置项,需要主动设置使用 DruidDataSource 。因为默认情况下,spring-boot-starter-jdbc
的DataSourceBuilder会按照DATA_SOURCE_TYPE_NAMES的顺序,尝试推断数据源的类型。spring.datasource.druid
配置项,设置 Druid 连接池的自定义配置。然后DruidDataSourceAutoConfigure会自动化配置 Druid 连接池。
filter.stat
配置项,我们配置了 DruidStatFilter,用于统计监控信息。对应文档《Druid —— 配置_StatFilter》。要注意,StatFilter 并不是我们说的javax.servlet.Filter,而是 Druid 提供的Filter拓展机制。filter.stat-view-servlet
配置项,我们配置了 DruidStatViewServlet,用于提供监控信息的展示的 html 页面和JSON API。对应文档《Druid —— 配置_StatViewServlet 配置》。StatViewServlet 就是我们说的javax.servlet.Filter。创建Application.java类,配置@SpringBootApplication
注解即可。代码如下:
@SpringBootApplication
public class Application implements CommandLineRunner {
private Logger logger = LoggerFactory.getLogger(Application.class);
@Autowired
private DataSource dataSource;
public static void main(String[] args) {
// 启动 Spring Boot 应用
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) {
logger.info("[run][获得数据源:{}]", dataSource.getClass());
}
}
执行日志如下:
2019-11-12 19:34:12.079 INFO 48359 --- [ main] c.a.d.s.b.a.DruidDataSourceAutoConfigure : Init DruidDataSource
2019-11-12 19:34:12.156 INFO 48359 --- [ main] com.alibaba.druid.pool.DruidDataSource : {dataSource-1} inited
2019-11-12 19:34:12.560 INFO 48359 --- [ main] c.i.s.lab19.datasourcepool.Application : [run][获得数据源:class com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper]
因为我们在 1.2应用配置中,做了如下操作:
spring.datasource.filter.stat
配置了 StatFilter ,统计监控信息。spring.datasource.filter.stat-view-servlet
配置了 StatViewServlet ,提供监控信息的展示的 html 页面和 JSON API 。所以我们在启动项目后,访问http://127.0.0.1:8080/druid
地址,可以看到监控 html 页面。如下图所示:
在界面的顶部,提供了数据源、SQL 监控、SQL 防火墙等等功能。
每个界面上,可以通过View JSON API获得数据的来源。同时,我们可以在JSON API(?http://127.0.0.1:8080/druid/api.html?)菜单对应的界面中,看到 StatViewServlet 内置的监控信息的 JSON API 列表。
因为监控信息是存储在 JVM 内存中,在 JVM 进程重启时,信息将会丢失。如果我们希望持久化到 MySQL、Elasticsearch、HBase 等存储器中,可以通过 StatViewServlet 提供的 JSON API 接口,采集监控信息。另外,有个druid-aggregated-monitor开源项目,提供了 集中监控分布式服务中的 Druid 连接池的方案和思路。
如果 StatViewServlet 提供的 JSON API 接口,无法满足我们的诉求,我们可以通过自定义 API 接口,使用DruidStatManagerFacade获得监控信息。使用示例DruidStatController代码如下
@RestController
public class DruidStatController {
@GetMapping("/monitor/druid/stat")
@Deprecated
public Object druidStat(){
// `DruidStatManagerFacade#getDataSourceStatDataList()` 方法,可以获取所有数据源的监控数据。
// 除此之外,DruidStatManagerFacade 还提供了一些其他方法,你可以按需选择使用。
return DruidStatManagerFacade.getInstance().getDataSourceStatDataList();
}
}
当然,绝大多数情况下,我们并不需要做这方面的拓展
和1.1引入依赖是一致。
在application.yml中,添加 Druid 配置,如下:
spring:
# datasource 数据源配置内容
datasource:
# 订单数据源配置
orders:
url: jdbc:mysql://127.0.0.1:3306/test_orders?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password:
type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource
# Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性
min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。
max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。
# 用户数据源配置
users:
url: jdbc:mysql://127.0.0.1:3306/test_users?useSSL=false&useUnicode=true&characterEncoding=UTF-8
driver-class-name: com.mysql.jdbc.Driver
username: root
password:
type: com.alibaba.druid.pool.DruidDataSource # 设置类型为 DruidDataSource
# Druid 自定义配置,对应 DruidDataSource 中的 setting 方法的属性
min-idle: 0 # 池中维护的最小空闲连接数,默认为 0 个。
max-active: 20 # 池中最大连接数,包括闲置和使用中的连接,默认为 8 个。
# Druid 自定已配置
druid:
# 过滤器配置
filter:
stat: # 配置 StatFilter ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatFilter
log-slow-sql: true # 开启慢查询记录
slow-sql-millis: 5000 # 慢 SQL 的标准,单位:毫秒
# StatViewServlet 配置
stat-view-servlet: # 配置 StatViewServlet ,对应文档 https://github.com/alibaba/druid/wiki/%E9%85%8D%E7%BD%AE_StatViewServlet%E9%85%8D%E7%BD%AE
enabled: true # 是否开启 StatViewServlet
login-username: yudaoyuanma # 账号
login-password: javaniubi # 密码
url
、driver-class-name
等数据源的通用配置放在同一级,这样后续我们只需要使用@ConfigurationProperties(prefix = "spring.datasource.orders")
的方式,就能完成 DruidDataSource 的配置属性设置。spring.datasource.druid
配置项下,我们还是配置了filter.stat
和stat-view-servlet
配置项,用于 Druid 监控功能。在cn.iocoder.springboot.lab19.datasourcepool.config包路径下,我们会创建DataSourceConfig配置类。代码如下:
// DataSourceConfig.java
@Configuration
public class DataSourceConfig {
/**
* 创建 orders 数据源
*/
@Primary
@Bean(name = "ordersDataSource")
@ConfigurationProperties(prefix = "spring.datasource.orders") // 读取 spring.datasource.orders 配置到 HikariDataSource 对象
public DataSource ordersDataSource() {
return DruidDataSourceBuilder.create().build();
}
/**
* 创建 users 数据源
*/
@Bean(name = "usersDataSource")
@ConfigurationProperties(prefix = "spring.datasource.users")
public DataSource usersDataSource() {
return DruidDataSourceBuilder.create().build();
}
}
创建Application.java类,配置@SpringBootApplication
注解即可。代码如下:
// Application.java
@SpringBootApplication
public class Application implements CommandLineRunner {
private Logger logger = LoggerFactory.getLogger(Application.class);
@Resource(name = "ordersDataSource")
private DataSource ordersDataSource;
@Resource(name = "usersDataSource")
private DataSource usersDataSource;
public static void main(String[] args) {
// 启动 Spring Boot 应用
SpringApplication.run(Application.class, args);
}
@Override
public void run(String... args) {
// orders 数据源
logger.info("[run][获得数据源:{}]", ordersDataSource.getClass());
// users 数据源
logger.info("[run][获得数据源:{}]", usersDataSource.getClass());
}
}
执行日志如下:
2019-11-12 21:39:24.063 INFO 49670 --- [ main] c.i.s.lab19.datasourcepool.Application : [run][获得数据源:class com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper]
2019-11-12 21:39:24.064 INFO 49670 --- [ main] c.i.s.lab19.datasourcepool.Application : [run][获得数据源:class com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceWrapper]
和2.4监控功能一致。
不过呢,我们在监控页面上,可以看到两个 Druid 数据库连接池。