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
# 配置監(jiān)控統(tǒng)計攔截的filters,去掉后監(jiān)控界面sql無法統(tǒng)計,'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的監(jiān)控數據
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/*","");
//監(jiān)控頁面登錄用戶名
initParameters.put("loginUsername","admin");
//監(jiān)控頁面登錄用戶密碼
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監(jiān)控頁面,必須在springboot配置文件中配置filters的stat
ps2:使用druid監(jiān)控頁面監(jiān)控kylin時,使用密文密碼可能會導致無法監(jiān)控sql的情況,可以使用明文密碼驗證