Spring Boot集成Druid

前言

关于Druid的详情和问题请看:

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

版本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>1.1.9</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.21</version>
</dependency>

正文

配置

该配置用的是多数据源。

application.yml 直接添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
spring:
datasource:
db1: //数据源1
driver-class-name: com.mysql.jdbc.Driver
jdbc-Url: jdbc:mysql://xxx:3306/db1
username: ptmind
password: ptmind2012
type: com.alibaba.druid.pool.DruidDataSource
db2: //数据源2
driver-class-name: com.mysql.jdbc.Driver
jdbc-Url: jdbc:mysql://xxx:3306/db2
username: ptmind
password: ptmind2012
type: com.alibaba.druid.pool.DruidDataSource
druid: //通用配置
validation-query: SELECT 1 FROM DUAL
test-while-idle: false
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size: 20
接管配置

上面的配置由于是多数据源,需要将数据源接管注入

db1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

package com.ptengine.ptconsole.config;

import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.SqlSessionTemplate;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;

import javax.sql.DataSource;

@Configuration
// basePackages 的配置就是mybatis的Mapper层
@MapperScan(basePackages = {"com.smoke.xxx.mapper.db1"}, sqlSessionTemplateRef = "db1SqlSessionTemplate")
public class Db1DataSourceConfig {

/**
* 这里的Bean形成后下面的Factory和Manager等自然传递
* ConfigurationProperties 就是读取yml的配置(db1的数据源)
*/
@Bean(name = "db1DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db1")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}

@Bean(name = "db1SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db1DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
// factoryBean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/test/*.xml"));
return factoryBean.getObject();
}
@Bean(name="db1TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("db1DataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "db1SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db1SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}

}

db2:

同理将DB2以相同的方式配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
@Configuration
@MapperScan(basePackages = {"com.smoke.xxx.mapper.db2"}, sqlSessionTemplateRef = "db2SqlSessionTemplate")
public class db2DataSourceConfig {

@Bean(name = "db2DataSource")
@ConfigurationProperties(prefix = "spring.datasource.db2")
public DataSource testDataSource() {
return DataSourceBuilder.create().build();
}

@Bean(name = "db2SqlSessionFactory")
public SqlSessionFactory testSqlSessionFactory(@Qualifier("db2DataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean factoryBean = new SqlSessionFactoryBean();
factoryBean.setDataSource(dataSource);
return factoryBean.getObject();
}
@Bean(name="db2TransactionManager")
public DataSourceTransactionManager testTransactionManager(@Qualifier("db2DataSource") DataSource dataSource){
return new DataSourceTransactionManager(dataSource);
}

@Bean(name = "db2SqlSessionTemplate")
public SqlSessionTemplate testSqlSessionTemplate(@Qualifier("db2SqlSessionFactory") SqlSessionFactory sqlSessionFactory) {
return new SqlSessionTemplate(sqlSessionFactory);
}

监控

上面的步骤可以直接使用多数据源的方式来进行操作,这里的步骤是开启druid的监控

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.ptengine.ptconsole.config;

import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;

@Configuration
public class DruidMonitorConfig {

@Bean
public ServletRegistrationBean servletRegistrationBean() {
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map<String,String> initParams = new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","admin");
initParams.put("allow","");//默认就是允许所有访问
bean.setInitParameters(initParams);
return bean;
}

@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map<String,String> initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}

这里配置好后直接访问

http://localhost:8080/druid/

结果:

cmd-markdown-logo

以上多数据源的配置及监控配置完毕。

Spring Boot的特点就是这种Config的形式来接管或注入或配置一些功能,Boot的思想就是无配置,包括xml,所以以这种config的方式来替代传统MVC的大量xml方式。