SpringBoot整合druid多数据源监控
2019-05-30 本文已影响0人
虫儿飞ZLEI
1. maven引入配置
<!--druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.0.16</version>
</dependency>
2. 配置数据源,SpringBoot 的配置文件
这里使用的是MySql+kylin两种数据源
spring:
datasource-kylin:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: org.apache.kylin.jdbc.Driver
url: jdbc:kylin://ip:7013/Pro01
username: ADMIN
password: ob98hyK9g/uvM/rIhpMT+WBLT7kdfOHfZC7slJcXPHcTxSTE//19/mbeJCsboK1Nn3Eub/xzdv+J8JHbWA+8SQ==
validationQuery: select 'x'
filters: default
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKK4LArN8Vx3wUuYS5tw6+YPmj/acdi9djlrTBE+1Nc32siEAr6BPb+PxkpGoI82MhyJeQK26yIh5B5MdIXNKcMCAwEAAQ==
connectionProperties: timeZone=GMT +08;druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${spring.datasource-kylin.publicKey}
datasource-mysql:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.jdbc.Driver
url: jdbc:mysql://192.168.202.162:3306/jcpt?useUnicode=true&characterEncoding=utf8
username: root
password: Fg8rH4UnByjNQ4d+kz+L3PSfBV4GoDlrINWIc9w6chBqwhdQnfJjvL83f1FwqhcwC8JI6/op46lp1BzWpoYcXQ==
initialSize: 20
minIdle: 3
maxActive: 200
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 30000
validationQuery: select 'x'
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
# 打开PSCache,并且指定每个连接上PSCache的大小
poolPreparedStatements: true
maxPoolPreparedStatementPerConnectionSize: 20
# 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
filters: config,stat,wall,slf4j
# 通过connectProperties属性来打开mergeSql功能;慢SQL记录
publicKey: MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBALsHTtzfPi8BdWb2ZYol4gxdsAoeeMlGHIT7lttLijCdeBCFgjr/yS6clTCFOsb5syw+qcOLDD7EFHpDhzlOiPkCAwEAAQ==
connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000;config.decrypt=true;config.decrypt.key=${spring.datasource-mysql.publicKey}
# 合并多个DruidDataSource的监控数据
useGlobalDataSourceStat: true
3. 配置对应数据源的bean
Mysql:
@Configuration
@MapperScan(basePackages = {"com.base.web.aisino.dao","com.base.web.common.dao","com.base.web.system.dao","com.base.web.test.dao"} , sqlSessionFactoryRef = "mysqlSessionFactory")
public class MysqlConfig {
/**
* 精确到 master 目录,以便跟其他数据源隔离
*/
private static final String MAPPER_LOCATION = "classpath:mybatis/*/*.xml";
@Value("${other.loginPassword}")
private String loginPassword;
@Autowired
@Qualifier("mysqlDataSource")
private DataSource mysqlDataSource;
@Bean(name = "mysqlTransactionManager")
@Primary
public DataSourceTransactionManager mysqlTransactionManager() {
return new DataSourceTransactionManager(mysqlDataSource);
}
@Bean(name = "mysqlSessionFactory")
@Primary
public SqlSessionFactory mysqlSessionFactory(@Qualifier("mysqlDataSource") DataSource mysqlDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(mysqlDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(MysqlConfig.MAPPER_LOCATION));
//添加驼峰命名法 映射
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
}
Kylin:
@Configuration
@MapperScan(basePackages = {"com.base.web.kylin.*.dao","com.base.web.openapi.*.dao"},sqlSessionFactoryRef = "kylinSessionFactory")
public class KylinConfig {
private static final String MAPPER_LOCATION = "classpath:kylinmybatis/*/*.xml";
@Autowired
@Qualifier("kylinDataSource")
private DataSource kylinDataSource;
@Bean(name = "kylinTransactionManager")
public DataSourceTransactionManager kylinTransactionManager() {
return new DataSourceTransactionManager(kylinDataSource);
}
@Bean(name = "kylinSessionFactory")
public SqlSessionFactory kylinSessionFactory(@Qualifier("kylinDataSource") DataSource kylinDataSource)
throws Exception {
final SqlSessionFactoryBean sessionFactory = new SqlSessionFactoryBean();
sessionFactory.setDataSource(kylinDataSource);
sessionFactory.setMapperLocations(new PathMatchingResourcePatternResolver()
.getResources(KylinConfig.MAPPER_LOCATION));
//添加驼峰命名法 映射
org.apache.ibatis.session.Configuration configuration = new org.apache.ibatis.session.Configuration();
configuration.setMapUnderscoreToCamelCase(true);
sessionFactory.setConfiguration(configuration);
return sessionFactory.getObject();
}
}
4. 配置druid页面相关信息
@Bean
@Primary
public ServletRegistrationBean druidServlet() {
ServletRegistrationBean reg = new ServletRegistrationBean();
reg.setServlet(new StatViewServlet());
reg.addUrlMappings("/druid/*");
//白名单
Map<String,String> initParameters = new HashMap<>(16);
//禁用HTML页面上的“REST ALL”功能
initParameters.put("resetEnable","false");
//IP白名单(没有配置或者为空,则允许所有访问)
initParameters.put("/druid/*","");
//监控页面登录用户名
initParameters.put("loginUsername","admin");
//监控页面登录用户密码
initParameters.put("loginPassword", loginPassword);
//ip黑名单
initParameters.put("deny","");
reg.setInitParameters(initParameters);
return reg;
}
@Bean
@Primary
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
filterRegistrationBean.setFilter(new WebStatFilter());
filterRegistrationBean.addUrlPatterns("/*");
filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
filterRegistrationBean.addInitParameter("profileEnable", "true");
filterRegistrationBean.addInitParameter("principalCookieName","USER_COOKIE");
filterRegistrationBean.addInitParameter("principalSessionName","USER_SESSION");
filterRegistrationBean.addInitParameter("DruidWebStatFilter","/*");
return filterRegistrationBean;
}
5. 访问页面查看
ip:port/druid
ps:若使用druid监控页面,必须在springboot配置文件中配置filters的stat
ps2:使用druid监控页面监控kylin时,使用密文密码可能会导致无法监控sql的情况,可以使用明文密码验证