一、Druid?
1.1 什么是Druid
- Druid是目前很好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource
- Druid支持所有JDBC兼容的数据库,包括Oracle、MySql、Derby、Postgresql、SQL Server、H2等等,并且Druid针对Oracle和MySql做了特别优化,比如Oracle的PS Cache内存占用优化,MySql的ping检测优化
- 通过Druid提供的监控功能,监控SQL的执行时间、ResultSet持有时间、返回行数、更新行数、错误次数、错误堆栈信息,可以清楚知道连接池和SQL的工作情况,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助
1.2 Druid的作用
- 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池
- 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助
- 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback
- SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况
- 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件
小结
- 充当数据库连接池
- 可以监控数据库访问性能
- 获得SQL执行日志
二、导入的maven依赖
<!--整合druid-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.10</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-configuration-processor</artifactId>
<optional>true</optional>
</dependency>
<!--整合druid-->
三、配置相关数据源
这里注意红框中的黄色背景参数,是因为实体类中没有对应的属性进行映射
以防部分参数未生效,所以实体类的属性需要一一对应数据源中的参数
下面是application.yml中的相关配置
spring:
datasource:
#配置druid连接池
druid:
username: root
password: root
url: jdbc:mysql://localhost:3306/MOxor?serverTimezone=UTC
driver-class-name: com.mysql.cj.jdbc.Driver
initialSize: 5
minIdle: 5
maxActive: 20
maxWait: 60000
timeBetweenEvictionRunsMillis: 60000
minEvictableIdleTimeMillis: 300000
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
poolPreparedStatements: true
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: stat,wall
maxPoolPreparedStatementPerConnectionSize: 20
useGlobalDataSourceStat: true
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500
下面是实体类DruidDataSourceProperties
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
@ConfigurationProperties(prefix = "spring.datasource.druid") //扫描配置类的属性前缀
public class DruidDataSourceProperties {
private String username;
private String password;
private String url;
private String driverClassName;
private Integer initialSize;
private Integer maxActive;
private Integer minIdle;
private long maxWait;
private boolean poolPreparedStatements;
private Integer timeBetweenEvictionRunsMillis;
private Integer minEvictableIdleTimeMillis;
private String validationQuery;
private boolean testWhileIdle;
private boolean testOnBorrow;
private boolean testOnReturn;
private String filters;
private Integer maxPoolPreparedStatementPerConnectionSize;
private boolean useGlobalDataSourceStat;
private String connectionProperties;
}
说明:
以下注解是lombok提供简化实体类创建get、set、toString、构造器的方法
@NoArgsConstructor
@AllArgsConstructor
@Getter
@Setter
@ToString
下面这个注解的作用是,简化application.yml参数与属性间映射关系,就不用在每个属性上使用@Value注解的形式了
@ConfigurationProperties(prefix = "spring.datasource.druid") //扫描配置类的属性前缀
四、自定义配置类
@Configuration
@EnableConfigurationProperties(value = DruidDataSourceProperties.class)
public class DruidDataSourceConfig {
@Autowired
private DruidDataSourceProperties druidDataSourceProperties;
@Bean
public DataSource dataSource() throws SQLException {
System.out.println(druidDataSourceProperties);
DruidDataSource druidDataSource = new DruidDataSource();
druidDataSource.setUsername(druidDataSourceProperties.getUsername());
druidDataSource.setPassword(druidDataSourceProperties.getPassword());
druidDataSource.setUrl(druidDataSourceProperties.getUrl());
druidDataSource.setDriverClassName(druidDataSourceProperties.getDriverClassName());
druidDataSource.setInitialSize(druidDataSourceProperties.getInitialSize());
druidDataSource.setMinIdle(druidDataSourceProperties.getMinIdle());
druidDataSource.setFilters(druidDataSourceProperties.getFilters());
druidDataSource.setMaxActive(druidDataSourceProperties.getMaxActive());
druidDataSource.setMaxWait(druidDataSourceProperties.getMaxWait());
druidDataSource.setPoolPreparedStatements(druidDataSourceProperties.isPoolPreparedStatements());
return druidDataSource;
}
/**
* 配置druid管理后台的servlet * @return
*/
@Bean
public ServletRegistrationBean statViewServlet() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String, Object> initParameters = new HashMap<>();
initParameters.put("loginUsername", "admin");
initParameters.put("loginPassword", "123456");
bean.setInitParameters(initParameters);
return bean;
}
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(new WebStatFilter());
filterRegistrationBean.setUrlPatterns(Arrays.asList("/*"));
Map<String, Object> initParams = new HashMap<>();
initParams.put("exclusions", "*.js,*.css,/druid/*");
filterRegistrationBean.setInitParameters(initParams);
return filterRegistrationBean;
}
}
注意:
statViewServlet()与filterRegistrationBean()并非必须配置的方法
但这里十分推荐加上,因为配置后才能使用Druid的后台监控界面
但注意在application.yml中必须有filters: stat参数,且保证实体类中能正确映射,最后dataSource()中包含druidDataSource.setFilters
五、测试
@RestController
public class DruidTestController {
@Autowired
private JdbcTemplate jdbcTemplate;
@RequestMapping("/testJdbc")
public List<Map<String, Object>> testJdbcTemplate() {
List<Map<String, Object>> testList = jdbcTemplate.queryForList("select * from test");
return testList;
}
}
请求路径:http://localhost:8081/testJdbc
笔者这里使用的Chrome,结合FeHelper插件美化JSON格式数据,结果为:
通过路径:http://localhost:8081/druid
来看看druid的监控界面,账号密码为:
statViewServlet()中的loginUsername和loginPassword
进入界面选择“SQL监控”就可以监控刚才执行的SQL啦!
六、参考
七、最后
若有不足,敬请指正
虚心若愚,求知若渴
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。