SpringBoot 整合 druid-spring-boot-starter 实现多数据源配置
本来今天我是有其他安排的,但是今天群里有一位同学在使用 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。并且给她升级了一下,实现了多数据源的功能。
要整合 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;
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;
@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,一切就是这么简单。
本文由 创作,采用 知识共享署名4.0 国际许可协议进行许可。本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名。最后编辑时间为: 2021/04/19 10:04