我这里使用的开发环境是:IDEA(2017),JDK(1.8),Maven(3.3.9),SpringBoot(使用的是2.0.3版本,详细创建过程可以参考:https://blog.csdn.net/qq_38455201/article/details/80742205)
第一步:导入maven依赖
com.alibaba
druid
1.1.10
com.alibaba
druid-spring-boot-starter
1.1.9
mysql
mysql-connector-java
5.1.21
tk.mybatis
mapper-spring-boot-starter
1.1.4
第二步:在application.properties文件当中引入以下配置
################## JDBC 配置 ################
#数据库配置
spring.datasource.druid.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.username=root
spring.datasource.druid.password=123456
################## 连接池配置 ################
#连接池建立时创建的初始化连接数
spring.datasource.druid.initial-size=5
#连接池中最大的活跃连接数
spring.datasource.druid.max-active=20
#连接池中最小的活跃连接数
spring.datasource.druid.min-idle=5
# 配置获取连接等待超时的时间
spring.datasource.druid.max-wait=60000
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
#spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.validation-query-timeout=30000
#是否在获得连接后检测其可用性
spring.datasource.druid.test-on-borrow=false
#是否在连接放回连接池后检测其可用性
spring.datasource.druid.test-on-return=false
#是否在连接空闲一段时间后检测其可用性
spring.datasource.druid.test-while-idle=true
#spring.datasource.druid.time-between-eviction-runs-millis=
#spring.datasource.druid.min-evictable-idle-time-millis=
#spring.datasource.druid.max-evictable-idle-time-millis=
########################## mybatis ##########################
#mapper.xml文件放置的位置
mybatis.mapper-locations=classpath:mapper/*.xml
第三步:编写DruidConfig.java类,进行初始化配置和监控配置(SpringBoot本来是集成了自动配置的,但是我这里就是不起效果,所以我只能自己手动的去配置了,不知道其他人会出现什么效果)
@Configuration
//自动扫描你的Dao包里面的Dao接口,我在这里使用的是mybatis操作数据库
@MapperScan("com.xxx.xxx.xxx")
public class DruidConfig {
//非常简单的配置druid数据库连接池
@ConfigurationProperties(prefix = "spring.datasource.druid")
@Bean
public DataSource druid(){
return new DruidDataSource();
}
//下面的1和2是配置Druid的监控
//1、配置一个管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map initParams = new HashMap<>();
initParams.put("loginUsername","admin");//登录druid监控的账户
initParams.put("loginPassword","admin");//登录druid监控的密码
initParams.put("allow","");//默认就是允许所有访问
initParams.put("deny","192.168.15.21");//黑名单的IP
bean.setInitParameters(initParams);
return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
现在我们打开http://localhost:8018/druid/login.html,用我们配置的druid监控的账号和密码进行登录,就可以看到监控的信息,发现我们配置的都已经生效了。
第一步:和单数据源一样的maven依赖
第二步:application.properties当中的配置信息
########################## mysql ##########################
#数据库配置
spring.datasource.druid.master.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.master.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.master.url=jdbc:mysql://localhost:3306/springboot?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.master.username=root
spring.datasource.druid.master.password=123456
########################## druid配置 ##########################
# 下面为连接池的补充设置,应用到上面所有数据源中# 初始化大小,最小,最大
################## 连接池配置 ################
#连接池建立时创建的初始化连接数
spring.datasource.druid.master.initial-size=5
#连接池中最大的活跃连接数
spring.datasource.druid.master.max-active=20
#连接池中最小的活跃连接数
spring.datasource.druid.master.min-idle=5
# 配置获取连接等待超时的时间
spring.datasource.druid.master.max-wait=60000
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.master.pool-prepared-statements=true
spring.datasource.druid.master.max-pool-prepared-statement-per-connection-size=20
#spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.master.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.master.validation-query-timeout=30000
#是否在获得连接后检测其可用性
spring.datasource.druid.master.test-on-borrow=false
#是否在连接放回连接池后检测其可用性
spring.datasource.druid.master.test-on-return=false
#是否在连接空闲一段时间后检测其可用性
spring.datasource.druid.master.test-while-idle=true
########################## mybatis ##########################
#mapper.xml文件放置的位置
mybatis.mapper-locations=classpath:mapper/*.xml
########################## mysql ##########################
#数据库配置
spring.datasource.druid.slave.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.slave.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.druid.slave.url=jdbc:mysql://localhost:3306/mybatis?useSSL=false&useUnicode=true&characterEncoding=utf-8&allowMultiQueries=true
spring.datasource.druid.slave.username=root
spring.datasource.druid.slave.password=123456
########################## druid配置 ##########################
# 下面为连接池的补充设置,应用到上面所有数据源中# 初始化大小,最小,最大
################## 连接池配置 ################
#连接池建立时创建的初始化连接数
spring.datasource.druid.slave.initial-size=5
#连接池中最大的活跃连接数
spring.datasource.druid.slave.max-active=20
#连接池中最小的活跃连接数
spring.datasource.druid.slave.min-idle=5
# 配置获取连接等待超时的时间
spring.datasource.druid.slave.max-wait=60000
# 打开PSCache,并且指定每个连接上PSCache的大小
spring.datasource.druid.slave.pool-prepared-statements=true
spring.datasource.druid.slave.max-pool-prepared-statement-per-connection-size=20
#spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.slave.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.slave.validation-query-timeout=30000
#是否在获得连接后检测其可用性
spring.datasource.druid.slave.test-on-borrow=false
#是否在连接放回连接池后检测其可用性
spring.datasource.druid.slave.test-on-return=false
#是否在连接空闲一段时间后检测其可用性
spring.datasource.druid.slave.test-while-idle=true
第三步:非常重要的两个数据连接池的java配置文件
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.pool.DruidDataSourceMBean;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.learning.four.dao.master", sqlSessionTemplateRef = "masterSqlSessionTemplate")
public class MasterDataSourceConfiguration {
@Bean(name = "masterDataSource")
//下面这个注解控制哪个实例优先被注入,我们放在第一个数据源上面
@Primary
@ConfigurationProperties(prefix = "spring.datasource.druid.master")
public DataSource dataSource() {
return new DruidDataSource();
}
@Bean(name = "masterSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("masterDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return bean.getObject();
}
@Bean(name = "masterTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("masterDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "masterSqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("masterSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
import com.alibaba.druid.pool.DruidDataSource;
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.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.core.io.support.PathMatchingResourcePatternResolver;
import org.springframework.jdbc.datasource.DataSourceTransactionManager;
import javax.sql.DataSource;
@Configuration
@MapperScan(basePackages = "com.learning.four.dao.slave", sqlSessionTemplateRef = "slaveSqlSessionTemplate")
public class SlaverDataSourceConfiguration {
@Bean(name = "slaveDataSource")
@ConfigurationProperties(prefix = "spring.datasource.druid.slave")
public DataSource dataSource() {
return new DruidDataSource();
}
@Bean(name = "slaveSqlSessionFactory")
@Primary
public SqlSessionFactory sqlSessionFactory(@Qualifier("slaveDataSource") DataSource dataSource) throws Exception {
SqlSessionFactoryBean bean = new SqlSessionFactoryBean();
bean.setDataSource(dataSource);
bean.setMapperLocations(new PathMatchingResourcePatternResolver().getResources("classpath:mapper/*.xml"));
return bean.getObject();
}
@Bean(name = "slaveTransactionManager")
@Primary
public DataSourceTransactionManager transactionManager(@Qualifier("slaveDataSource") DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
@Bean(name = "slaveSqlSessionTemplate")
@Primary
public SqlSessionTemplate sqlSessionTemplate(@Qualifier("slaveSqlSessionFactory") SqlSessionFactory sqlSessionFactory)
throws Exception {
return new SqlSessionTemplate(sqlSessionFactory);
}
}
单独一个配置文件,配置druid的监控
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;
//Druid监控配置
@Configuration
public class DruidMoniterConfig
{
//1、配置一个管理后台的Servlet
@Bean
public ServletRegistrationBean statViewServlet(){
ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
Map initParams = new HashMap<>();
initParams.put("loginUsername","admin");
initParams.put("loginPassword","admin");
initParams.put("allow","");//默认就是允许所有访问
initParams.put("deny","192.168.15.21");//黑名单的IP
bean.setInitParameters(initParams);
return bean;
}
//2、配置一个web监控的filter
@Bean
public FilterRegistrationBean webStatFilter(){
FilterRegistrationBean bean = new FilterRegistrationBean();
bean.setFilter(new WebStatFilter());
Map initParams = new HashMap<>();
initParams.put("exclusions","*.js,*.css,/druid/*");
bean.setInitParameters(initParams);
bean.setUrlPatterns(Arrays.asList("/*"));
return bean;
}
}
在启动的时候,我们会发现打印出下面的信息:
我们请求/moniter方法,让他们去查询数据并打印出来,发现能够从两个数据源当中的两个表当中查询出正确的结果。并且我们还看到了数据源在这个时候进行了初始化(inited):这样也可以得出结论就是:我们的数据连接池是在我们第一次使用的时候进行初始化的。
最后,我们进入druid监控,能够看到如下的信息
在这个页面往下滑动鼠标,会看到第二个数据源的信息
以上的代码都是经过我严格测试的,我自己也调试了很长时间,期间碰到了很多的问题,好在最后终于成功了。假如你参照上面的代码没有成功,也可以留言留下邮箱信息,我会直接把代码发送给你,大家一起研究,一起学习。
我之前也有一篇文章去写如何配置druid数据库连接池,为什么还要写最新的一篇呢?
在我上一篇文章当中,首先使用的是1.5.6版本的springboot,我在这里使用springboot2.0.3版本的时候发现把代码直接复制过来无法完成配置,其中RelaxedPropertyResolver这个类在springboot版本升级之后消失了,springboot2.0引入了更加宽松的绑定规则。所以在这里更新一篇springboot2.0+版本的druid配置,老版本的直接可以复制上一篇的去用就可以了。