在单数据源的情况下,Spring Boot的配置非常简单,只需要在application.properties文件中配置连接参数即可。但是往往随着业务量发展,我们通常会进行数据库拆分或是引入其他数据库,从而我们需要配置多个数据源,下面介绍多数据源的配置方式。

主要目录结构:主要关注红色方框中与本节相关的类。

  1. pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.easted</groupId><artifactId>card</artifactId><version>0.0.1-SNAPSHOT</version><packaging>jar</packaging><name>card</name><description>Demo project for Spring Boot</description><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>1.5.6.RELEASE</version><relativePath /> <!-- lookup parent from repository --></parent><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding><project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding><java.version>1.8</java.version><spring-cloud.version>Dalston.SR3</spring-cloud.version></properties><dependencies><dependency>  <groupId>com.fasterxml.jackson.core</groupId><artifactId>jackson-databind</artifactId><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency> <groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-thymeleaf</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId><scope>runtime</scope></dependency><!-- 阿里的druid依赖 --><dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.0.19</version></dependency><!-- 格式化对象,方便输出日志 -->  <dependency>  <groupId>com.alibaba</groupId>  <artifactId>fastjson</artifactId>  <version>1.1.41</version>  </dependency>  <dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><scope>runtime</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jdbc</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!-- lombok 在类上加@Data可以省略get、set方法 --><!-- <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><scope>provided</scope></dependency> --><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-rest</artifactId></dependency><dependency><groupId>org.eclipse.persistence</groupId><artifactId>javax.persistence</artifactId><version>2.0.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency><dependency><groupId>org.scala-lang</groupId><artifactId>scala-library</artifactId><version>2.11.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-elasticsearch</artifactId></dependency><dependency><groupId>com.sun.jna</groupId><artifactId>jna</artifactId><version>3.0.9</version></dependency><dependency><groupId>org.codehaus.jackson</groupId><artifactId>jackson-mapper-asl</artifactId><version>1.9.8</version><type>jar</type><scope>compile</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-jta-atomikos</artifactId></dependency></dependencies><dependencyManagement><dependencies><dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-dependencies</artifactId><version>${spring-cloud.version}</version><type>pom</type><scope>import</scope></dependency></dependencies></dependencyManagement><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>
  1. application.yml
# Server configuration
server:port: 8090contextPath:# Spring configuration
spring:thymeleaf: cache: falsemvc: favicon:enabled: false#Multi DataSource Configdatasource: primary:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:postgresql://127.0.0.1/db_oneusername: wanghpassword: easted2013driverClassName: org.postgresql.DriverinitialSize: 5minIdle: 5maxActive: 200maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,wall,log4jconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000slave:type: com.alibaba.druid.pool.DruidDataSourceurl: jdbc:postgresql://127.0.0.1/db_twousername: wanghpassword: easted2013driverClassName: org.postgresql.DriverinitialSize: 5minIdle: 5maxActive: 200maxWait: 60000timeBetweenEvictionRunsMillis: 60000minEvictableIdleTimeMillis: 300000validationQuery: SELECT 'x'testWhileIdle: truetestOnBorrow: falsetestOnReturn: falsepoolPreparedStatements: truemaxPoolPreparedStatementPerConnectionSize: 20filters: stat,wall,log4jconnectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000jpa:show-sql: true hibernate: ddl-auto: updateproperties:hibernate: dialect: org.hibernate.dialect.PostgreSQLDialect
  1. DataSourceConfig类
package com.easted.card.core.config;import javax.sql.DataSource;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 com.alibaba.druid.pool.DruidDataSource;/**1. @ClassName:DataSourceConfig2. @author:wh3. @date: 2017年9月12日 上午10:33:39*/
@Configuration
public class DataSourceConfig {@Bean(name = "primaryDataSource")@Qualifier("primaryDataSource")@Primary//配置该数据源为主数据源@ConfigurationProperties(prefix = "spring.datasource.primary")public DataSource primaryDataSource(){
//      return DataSourceBuilder.create().build();return new DruidDataSource();}@Bean(name = "slaveDataSource")@Qualifier("slaveDataSource")@ConfigurationProperties(prefix = "spring.datasource.slave")public DataSource secondDataSource(){
//      return DataSourceBuilder.create().build();return new DruidDataSource();}
}
  1. PrimaryConfig类
    新增对第一数据源的JPA配置,注意两处注释的地方,用于指定数据源对应的Entity实体和Repository定义位置,用@Primary区分主数据源。
package com.easted.card.core.config;import java.util.HashMap;
import java.util.Map;import javax.persistence.EntityManager;
import javax.sql.DataSource;import org.hibernate.cfg.ImprovedNamingStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;/**1. @ClassName:PrimaryConfig2. @author:Wh3. @date: 2017年9月13日 上午10:11:40*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactoryPrimary",transactionManagerRef="transactionManagerPrimary",basePackages= { "com.easted.card.core.repository.primary"}) //设置Repository所在位置
public class PrimaryConfig {@Autowired @Qualifier("primaryDataSource")private DataSource primaryDataSource;@Primary@Bean(name = "entityManagerPrimary")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactoryPrimary(builder).getObject().createEntityManager();}@Bean(name = "entityManagerFactoryPrimary")@Primarypublic LocalContainerEntityManagerFactoryBean entityManagerFactoryPrimary (EntityManagerFactoryBuilder builder) {return builder.dataSource(primaryDataSource).packages("com.easted.card.core.entity.postgre1").persistenceUnit("primary").properties(buildProperties()).build();} @Bean(name="transactionManagerPrimary")@Autowiredpublic PlatformTransactionManager primaryTransactionManager(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactoryPrimary(builder).getObject());}// 公共jpa设置@Value("${spring.jpa.hibernate.ddl-auto}")String dll;@Value("${spring.jpa.properties.hibernate.dialect}")String dialect;@Value("${spring.jpa.show-sql}")String showSql;private Map<String, Object> buildProperties() {Map<String, Object> properties = new HashMap<String, Object>();properties.put("hibernate.ejb.naming_strategy", ImprovedNamingStrategy.class.getName());properties.put("hibernate.hbm2ddl.auto", dll);properties.put("hibernate.dialect", dialect);properties.put("hibernate.show_sql", showSql);return properties;}
}
  1. SlaveConfig类
package com.easted.card.core.config;import java.util.HashMap;
import java.util.Map;import javax.persistence.EntityManager;
import javax.sql.DataSource;import org.hibernate.cfg.ImprovedNamingStrategy;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.orm.jpa.EntityManagerFactoryBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
import org.springframework.orm.jpa.JpaTransactionManager;
import org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean;
import org.springframework.transaction.PlatformTransactionManager;
import org.springframework.transaction.annotation.EnableTransactionManagement;/*** SlaveConfig* @author:Wh* @date: 2017年9月13日 上午10:11:40*/
@Configuration
@EnableTransactionManagement
@EnableJpaRepositories(entityManagerFactoryRef="entityManagerFactorySlave",transactionManagerRef="transactionManagerSlave",basePackages= { "com.easted.card.core.repository.slave"}) //设置Repository所在位置
public class SlaveConfig {@Autowired @Qualifier("slaveDataSource")private DataSource slaveDataSource;@Bean(name = "entityManagerSlave")public EntityManager entityManager(EntityManagerFactoryBuilder builder) {return entityManagerFactorySlave(builder).getObject().createEntityManager();}@Bean(name = "entityManagerFactorySlave")public LocalContainerEntityManagerFactoryBean entityManagerFactorySlave(EntityManagerFactoryBuilder builder) {return builder.dataSource(slaveDataSource).packages("com.easted.card.core.entity.postgre2").persistenceUnit("slave").properties(buildProperties()).build();} @Bean(name="transactionManagerSlave")@Autowiredpublic PlatformTransactionManager slaveTransactionManager(EntityManagerFactoryBuilder builder) {return new JpaTransactionManager(entityManagerFactorySlave(builder).getObject());}// 公共jpa设置@Value("${spring.jpa.hibernate.ddl-auto}")String dll;@Value("${spring.jpa.properties.hibernate.dialect}")String dialect;@Value("${spring.jpa.show-sql}")String showSql;private Map<String, Object> buildProperties() {Map<String, Object> properties = new HashMap<String, Object>();properties.put("hibernate.ejb.naming_strategy", ImprovedNamingStrategy.class.getName());properties.put("hibernate.hbm2ddl.auto", dll);properties.put("hibernate.dialect", dialect);properties.put("hibernate.show_sql", showSql);return properties;}
}
  1. DruidConfig类
package com.easted.card.core.config;import java.util.HashMap;
import java.util.Map;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
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 org.springframework.transaction.annotation.EnableTransactionManagement;import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;/**1. 配置Druid监控2. @ClassName:DruidDBConfig3. @author:Wh4. @date: 2017年8月23日 下午3:21:51*/
@Configuration
@EnableTransactionManagement
public class DruidConfig{private static final Logger log = LoggerFactory.getLogger(DruidConfig.class);@Bean public ServletRegistrationBean druidServlet() { log.info("开始Druid Servlet初始化配置..."); ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean(); servletRegistrationBean.setServlet(new StatViewServlet());servletRegistrationBean.addUrlMappings("/druid/*"); Map<String, String> initParameters = new HashMap<String, String>(); //用户名 initParameters.put("loginUsername", "wangh");//密码initParameters.put("loginPassword", "easted"); // 禁用HTML页面上的“Reset All”功能 initParameters.put("resetEnable", "false");// IP白名单 (没有配置或者为空,则允许所有访问) initParameters.put("allow", "127.0.0.1"); // IP黑名单 (存在共同时,deny优先于allow) initParameters.put("deny", "");servletRegistrationBean.setInitParameters(initParameters); return servletRegistrationBean; } @Bean public FilterRegistrationBean filterRegistrationBean() { FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(new WebStatFilter()); filterRegistrationBean.addUrlPatterns("/*"); filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"); return filterRegistrationBean; } }
  1. 实体类

在postgre1和postgre2包下分别建实体类。

package com.easted.card.core.entity.postgre1;import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;@Entity
public class Book {@Id@GeneratedValueprivate Integer id;private String name;/*** @Title: getId <BR>* @return:Integer <BR>*/public Integer getId() {return id;}/*** @param id the id to set*/public void setId(Integer id) {this.id = id;}/*** @Title: getName <BR>* @return:String <BR>*/public String getName() {return name;}/*** @param name the name to set*/public void setName(String name) {this.name = name;}}
  1. primary包下BookRepository接口
package com.easted.card.core.repository.primary;import org.springframework.data.jpa.repository.JpaRepository;import com.easted.card.core.entity.postgre1.Book;
public interface BookRepository extends JpaRepository<Book, Integer> {}
  1. slave包下BookRepository接口
package com.easted.card.core.repository.slave;import org.springframework.data.jpa.repository.JpaRepository;import com.easted.card.core.entity.postgre2.Book;
public interface BookRepository extends JpaRepository<Book, Integer> {}

然后启动springboot.就可以了。
浏览器输入http://localhost:8090/druid/login.html

输入druidconfig配置的用户名密码。

可以看到有两个数据源。

SpringBoot配置多数据源(结合Druid)相关推荐

  1. 关于Springboot 配置多数据源 Druid 德鲁伊

    关于Springboot 配置多数据源 Druid 德鲁伊 yml config yml server:port: 8080servlet:encoding:charset: UTF-8 spring ...

  2. SpringBoot 配置多数据源

    项目Git地址:SpringBoot 配置多数据源:Jacob-multi-data-source 准备工作 准备两个数据库(此模块中两个数据库一个为本地 一个为远程,本地为主,远程为从).然后建表. ...

  3. SpringBoot 配置多数据源(Sql Server、MySql)

    创建SpringBoot项目就不说了.(直接使用IDEA创建就好了) 整个目录结构如图:(不用管图中报错,项目是在另一台电脑上写的.报错是没有jar包,因为网络比较慢.) 1.主要pom.xml &l ...

  4. SpringBoot配置多数据源数据库

    ** 一.SpringBoot + Druid + Mybatisplus 使用注解整合 ** 主要依赖包: spring-boot-starter-web mybatis-plus-boot-sta ...

  5. SpringBoot配置多数据源Mybatis/MybatisPlus/mysql

    一.前言 项目开发过程中,单一数据源不能满足开发需求或者需要用到主从数据库的时候,引入多数据源配置在项目中显得尤为必要.下面简单介绍一种在spingboot中结合mybatis针对同类型的数据源mys ...

  6. SpringBoot配置多数据源(MySQL+SQLServer)

    最近刚学习springboot,为了以后的开发需要故搭建双数据源配置,本文中使用了MySQL+SQLServer,若想在换成oracle数据库,直接在此数据配置的基础上进行再增加一个类似的配置,项目主 ...

  7. SpringBoot 配置多数据源 dynamic-datasource(多库)

    1.Maven 包 <!-- 多数据源配置 --> <dependency><groupId>com.baomidou</groupId><art ...

  8. Reason: Failed to determine a suitable driver class springboot配置了数据源,启动包url找不到 Reason: Failed to

    自学springboot头疼啊,明明已经配置了数据源,但是在启动项目的时候总是报上面的错误. 网上最多的一种就是给springApplication添加 Exculed 关闭 DataAutowire ...

  9. springboot配置mysql数据源_SpringBoot+mysql配置两个数据源

    1.properties配置文件信息 spring.datasource.primary.jdbc-url=jdbc:mysql://rm... spring.datasource.primary.u ...

最新文章

  1. Dubbo常见面试题及答案汇总1000道(春招+秋招+社招)
  2. 自动驾驶规划方法综述
  3. JavaScript错误:Maximum call stack size exceeded错误
  4. Flex的NumericStepper控件
  5. Eclipse中CVS版本管理
  6. 国内外NLP领域学术界和工业界的牛人和团队
  7. mysql三-3:完整性约束
  8. Kinect2.0获取数据
  9. 解决用户意外退出在线列表无法及时更新问题2(转载)
  10. Android设为系统默认的短信应用
  11. Leetcode之合并区间
  12. 【翻译】图解Janusgraph系列-事务详解(Janusgraph Transactions)
  13. linux vm编辑文件命令行,linux vm编辑器操作
  14. 我招聘了一名程序员,试用期都过了,结果发现他学历是假的...
  15. 【AWS】一、如何在AWS免费撸一年的服务器
  16. 穿越派·派盘 + Solid Explorer = 全能 Android 文件管理器
  17. latex 论文算法编辑
  18. 详细分析PHP源代码后门事件及其供应链安全启示
  19. flask项目之5:短信验证码发送
  20. Codeforces 432C (哥德巴赫猜想的巧妙应用)

热门文章

  1. ib什么意思_IB课程是什么?为什么越来越多的人学习?
  2. Python输入与输出(基础篇)
  3. xampp中localhost与DreamWaver站点设置问题
  4. Airtest远程、无线连接手机
  5. asp.net中web.config巧妙使用appSetting和connectionStrings
  6. 专项测试-Web兼容性测试
  7. 2019年软件行业薪酬水平_软件工作的薪水是全国平均水平的两倍
  8. 单片机测周法c语言程序,基于单片机的数字频率计设计(附原理图及源程序).doc...
  9. subunit 协议
  10. KOREANO ESSENTIAL打造气质职场范