SpringBoot 整合 druid-spring-boot-starter 实现多数据源配置

JAVA herman 3647浏览
公告:“业余草”微信公众号提供免费CSDN下载服务(只下Java资源),关注业余草微信公众号,添加作者微信:xttblog,发送下载链接帮助你免费下载!
本博客日IP超过1800,PV 2600 左右,急需赞助商。
极客时间所有课程通过我的二维码购买后返现24元微信红包,请加博主新的微信号:xttblog,之前的微信号好友位已满,备注:返现
所有面试题(java、前端、数据库、springboot等)一网打尽,请关注文末小程序
视频教程免费领

本来今天我是有其他安排的,但是今天群里有一位同学在使用 SpringBoot 整合 Druid。我发现她搞了一上午了,一个整合还没搞定,我都替她着急了。于是便有这篇 SpringBoot 整合 Druid 的教程!

这位同学,在启动项目后报:Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured. 异常。详细异常如下所示:

Failed to configure a DataSource: 'url' attribute is not specified and no embedded datasource could be configured.

Reason: Failed to determine a suitable driver class

这个异常大致看一下就是知道了,是配置的问题。url 肯定没配置正确。所以,我就给她完整的写了一个 demo。并且给她升级了一下,实现了多数据源的功能。

springboot 整合 druid

要整合 Druid 只需要简单的几步即可完成。我这里使用 druid-spring-boot-starter 来进行整合,因为 SpringBoot 最提倡的做法就是引用 starter。

第一步,我们只需在 Maven 中引入下面的配置:

<dependency>
   <groupId>com.alibaba</groupId>
   <artifactId>druid-spring-boot-starter</artifactId>
   <version>1.1.10</version>
</dependency>

版本大家可以自己根据需要进行选择。

第二步,application.properties 加入数据库源配置。

spring.datasource.url=jdbc:mysql://localhost:3306/xttblog
spring.datasource.username=xttblog
spring.datasource.password=xttblog
# ...其他配置(可选,不是必须的,使用内嵌数据库的话上述三项也可省略不填)

第三步,我们创建一个 UserRepository 用来测试,这个 UserRepository 就是我们的 Dao。

package com.xttblog.druid.demo.dao;
import com.xttblog.druid.demo.model.User;
import org.springframework.data.repository.CrudRepository;
// 业余草:www.xttblog.com
public interface UserDao extends CrudRepository<User, Long> {}

第四步,创建我们的 User 实体类。

package com.xttblog.druid.demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    // get/set 省略
}

第五步,测试我们的项目是否搭建完成。

package com.xttblog.druid.demo.test;
import com.xttblog.druid.demo.dao.UserDao;
import com.xttblog.druid.demo.model.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;
import javax.annotation.PostConstruct;
// 业余草:www.xttblog.com
@Configuration
@Profile("default")
public class InitConfigurer{
    @Autowired
    private UserDao userDao;
    @PostConstruct
    public  void  init(){
        for (int i = 1; i <= 100; i++) {
        	// 循环添加 100 个对象。
            userDao.save(new User("TEST-NAME-XTTBLOG-" + i));
        }
    }
}

没有第六步了,如果有那就把启动类给算上。

package com.xttblog.druid.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class DemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }
}

SpringBoot 整合 Druid 就这么简单。下面我们对配置属性多扯一点。

spring.datasource.druid.url= # 或spring.datasource.url= 
spring.datasource.druid.username= # 或spring.datasource.username=
spring.datasource.druid.password= # 或spring.datasource.password=
spring.datasource.druid.driver-class-name= #或 spring.datasource.driver-class-name=

上面的配置是等价的。前面我们根本就没有配置 spring.datasource.driver-class-name 属性。为什么可以不配置呢?很简单 driver-class-name 属性 Druid 可以根据 url 推断出来,够智能吧。

连接池和监控配置示例如下:

#连接池配置
spring.datasource.druid.initial-size=
spring.datasource.druid.max-active=
spring.datasource.druid.min-idle=
spring.datasource.druid.max-wait=
spring.datasource.druid.pool-prepared-statements=
spring.datasource.druid.max-pool-prepared-statement-per-connection-size= 
spring.datasource.druid.max-open-prepared-statements= #和上面的等价
spring.datasource.druid.validation-query=
spring.datasource.druid.validation-query-timeout=
spring.datasource.druid.test-on-borrow=
spring.datasource.druid.test-on-return=
spring.datasource.druid.test-while-idle=
spring.datasource.druid.time-between-eviction-runs-millis=
spring.datasource.druid.min-evictable-idle-time-millis=
spring.datasource.druid.max-evictable-idle-time-millis=
spring.datasource.druid.filters= #配置多个英文逗号分隔

#监控配置
# WebStatFilter配置,说明请参考Druid Wiki,配置_配置WebStatFilter
spring.datasource.druid.web-stat-filter.enabled= #是否启用StatFilter默认值true
spring.datasource.druid.web-stat-filter.url-pattern=
spring.datasource.druid.web-stat-filter.exclusions=
spring.datasource.druid.web-stat-filter.session-stat-enable=
spring.datasource.druid.web-stat-filter.session-stat-max-count=
spring.datasource.druid.web-stat-filter.principal-session-name=
spring.datasource.druid.web-stat-filter.principal-cookie-name=
spring.datasource.druid.web-stat-filter.profile-enable=

# StatViewServlet配置,说明请参考Druid Wiki,配置_StatViewServlet配置
spring.datasource.druid.stat-view-servlet.enabled= #是否启用StatViewServlet默认值true
spring.datasource.druid.stat-view-servlet.url-pattern=
spring.datasource.druid.stat-view-servlet.reset-enable=
spring.datasource.druid.stat-view-servlet.login-username=
spring.datasource.druid.stat-view-servlet.login-password=
spring.datasource.druid.stat-view-servlet.allow=
spring.datasource.druid.stat-view-servlet.deny=

# Spring监控配置,说明请参考Druid Github Wiki,配置_Druid和Spring关联监控配置
spring.datasource.druid.aop-patterns= # Spring监控AOP切入点,如x.y.z.service.*,配置多个英文逗号分隔

多数据源 application-multi-datasource.properties 配置示例如下:

spring.datasource.url=
spring.datasource.username=
spring.datasource.password=

# Druid 数据源配置,继承spring.datasource.* 配置,相同则覆盖
...
spring.datasource.druid.initial-size=5
spring.datasource.druid.max-active=5
...

# Druid 数据源 1 配置,继承spring.datasource.druid.* 配置,相同则覆盖
...
spring.datasource.druid.one.max-active=10
spring.datasource.druid.one.max-wait=10000
...

# Druid 数据源 2 配置,继承spring.datasource.druid.* 配置,相同则覆盖
...
spring.datasource.druid.two.max-active=20
spring.datasource.druid.two.max-wait=20000
...

注意:Spring Boot 2.X 版本不再支持配置继承,多数据源的话每个数据源的所有配置都需要单独配置,否则配置不会生效。

多数据源的创建示例如下:

@Configuration
@Profile("multi-datasource")
public class MultiDataSourceConfigurer {
    @Primary
    @Bean(initMethod = "init")
    @ConfigurationProperties("spring.datasource.druid.one")
    public DataSource dataSourceOne(){
        return DruidDataSourceBuilder.create().build();
    }

    @Bean(initMethod = "init")
    @ConfigurationProperties("spring.datasource.druid.two")
    public DataSource dataSourceTwo(){
        return DruidDataSourceBuilder.create().build();
    }
}

OK,一切就是这么简单。

业余草公众号

最后,欢迎关注我的个人微信公众号:业余草(yyucao)!可加QQ1群:135430763(2000人群已满),QQ2群:454796847(已满),QQ3群:187424846(已满)。QQ群进群密码:xttblog,想加微信群的朋友,之前的微信号好友已满,请加博主新的微信号:xttblog,备注:“xttblog”,添加博主微信拉你进群。备注错误不会同意好友申请。再次感谢您的关注!后续有精彩内容会第一时间发给您!原创文章投稿请发送至532009913@qq.com邮箱。商务合作可添加助理微信进行沟通!

本文原文出处:业余草: » SpringBoot 整合 druid-spring-boot-starter 实现多数据源配置