我这里使用的开发环境是:IDEA(2017),JDK(1.8),Maven(3.3.9),SpringBoot(使用的是2.0.3版本,详细创建过程可以参考:https://blog.csdn.net/qq_38455201/article/details/80742205)
一:单数据源的配置以及数据监控
第一步:导入maven依赖
<!--数据库连接驱动和连接池依赖--> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid-spring-boot-starter</artifactId> <version>1.1.9</version> </dependency> <!--mysql--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>5.1.21</version> </dependency> <dependency> <groupId>tk.mybatis</groupId> <artifactId>mapper-spring-boot-starter</artifactId> <version>1.1.4</version> </dependency>
第二步:在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<String,String> 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<String,String> 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<String,String> 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<String,String> 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配置,老版本的直接可以复制上一篇的去用就可以了。