`
rensanning
  • 浏览: 3547894 次
  • 性别: Icon_minigender_1
  • 来自: 大连
博客专栏
Efef1dba-f7dd-3931-8a61-8e1c76c3e39f
使用Titanium Mo...
浏览量:38135
Bbab2146-6e1d-3c50-acd6-c8bae29e307d
Cordova 3.x入门...
浏览量:607256
C08766e7-8a33-3f9b-9155-654af05c3484
常用Java开源Libra...
浏览量:682254
77063fb3-0ee7-3bfa-9c72-2a0234ebf83e
搭建 CentOS 6 服...
浏览量:89314
E40e5e76-1f3b-398e-b6a6-dc9cfbb38156
Spring Boot 入...
浏览量:401781
Abe39461-b089-344f-99fa-cdfbddea0e18
基于Spring Secu...
浏览量:69685
66a41a70-fdf0-3dc9-aa31-19b7e8b24672
MQTT入门
浏览量:91690
社区版块
存档分类
最新评论

Spring Boot 入门 - 基础篇(11)- 数据源配置

 
阅读更多
(1)单一数据源

默认Spring Boot会在classpath中查找H2, HSQL, Derby等内存数据库的jar包自动配置一个内存数据库的DataSource。
<dependency>
    <groupId>org.hsqldb</groupId>
    <artifactId>hsqldb</artifactId>
    <scope>runtime</scope>
</dependency>


但如果在application.properties中设置了spring.datasource.*相关的信息,Spring Boot会自定使用该设置自动配置DataSource。
引用
spring.datasource.url=jdbc:mysql://localhost/test
spring.datasource.username=dbuser
spring.datasource.password=dbpass
spring.datasource.driver-class-name=com.mysql.jdbc.Driver


(2)多个数据源

数据源不局限于数据库:
  • 多种数据库,比如:MySQL里的DB1、PostgreSQL的DB2、Oracle的DB3
  • 一种数据库里的多个库,比如:MySQL里的DB1、DB2、DB3


引用
# MySQL database
spring.ds_mysql.url=jdbc:mysql://localhost:3306/rensanning
spring.ds_mysql.username=root
spring.ds_mysql.password=root
spring.ds_mysql.driverClassName=com.mysql.jdbc.Driver

# PostgreSQL database
spring.ds_pg.url=jdbc:postgresql://localhost:5432/rensanning
spring.ds_pg.username=postgres
spring.ds_pg.password=postgres
spring.ds_pg.driverClassName=org.postgresql.Driver

# Oracle database
spring.ds_oracle.url=jdbc:oracle:thin:@localhost:1521:rensanning
spring.ds_oracle.username=scott
spring.ds_oracle.password=tiger
spring.ds_oracle.driverClassName=oracle.jdbc.driver.OracleDriver


@Configuration
public class MultipleDBConfig {

	@Bean(name = "mysqlDB")
	@Primary
	@ConfigurationProperties(prefix = "spring.ds_mysql")
	public DataSource mysqlDataSource() {
		return DataSourceBuilder.create().build();
	}

	@Bean(name = "postgresDB")
	@ConfigurationProperties(prefix = "spring.ds_pg")
	public DataSource postgresDataSource() {
		return  DataSourceBuilder.create().build();
	}

	@Bean(name = "oracleDB")
	@ConfigurationProperties(prefix = "ds_oracle")
	public DataSource oracleDataSource() {
		return  DataSourceBuilder.create().build();
	}

}


使用@Autowired注入时会首先使用被标记为@Primary的Bean。

@Autowired
private DataSource mysqlDataSource;

@Autowired @Qualifier("postgresDB") 
private DataSource postgresDataSource;

@Autowired @Qualifier("oracleDB")
private DataSource oracleDataSource;


(3)动态数据源
Spring提供org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource来支持DataSource路由配置,具体可以参考官网Blog:https://spring.io/blog/2007/01/23/dynamic-datasource-routing/

a - 定义配置

public enum SchemaType { 
    DEFAULT, MASTER, SLAVE
}


@Component
@Configuration
public class DatasourceConfig {

    public DataSource defaultDatasource(){
        DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/rensanning01");
        ds.setUsername("user01");
        ds.setPassword("pass01");
        return ds;
    }

    public DataSource masterDatasource(){
        DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/rensanning02");
        ds.setUsername("user02");
        ds.setPassword("pass02");
        return ds;
    }

    public DataSource slaveDatasource(){
        DataSource ds = new org.apache.tomcat.jdbc.pool.DataSource();
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://localhost:3306/rensanning03");
        ds.setUsername("user03");
        ds.setPassword("pass03");
        return ds;
    }

    @Bean
    public DynamicRoutingDataSourceResolver dataSource() {
        DynamicRoutingDataSourceResolver resolver = new DynamicRoutingDataSourceResolver();

        Map<Object, Object> dataSources = new HashMap<Object,Object>();
        dataSources.put("default", defaultDatasource());
        dataSources.put("master", masterDatasource());
        dataSources.put("slave", slaveDatasource());

        resolver.setTargetDataSources(dataSources);

        // default datasource
        resolver.setDefaultTargetDataSource(masterDatasource());

        return resolver;
    }
}


public class DynamicRoutingDataSourceResolver extends AbstractRoutingDataSource {

    @Override
    protected Object determineCurrentLookupKey() {
        if (SchemaContextHolder.getSchemaType() == null) {
            return "default";
        }

        if(SchemaContextHolder.getSchemaType() == SchemaType.MASTER) {
            return "master";
        }

        if(SchemaContextHolder.getSchemaType() == SchemaType.SLAVE) {
            return "slave";
        }

        return "default";
    }

}


public class SchemaContextHolder {
    private static ThreadLocal<SchemaType> contextHolder = new ThreadLocal<SchemaType>();

    public static void setSchemaType(SchemaType datasourcename) {
        contextHolder.set(datasourcename);
    }

    public static SchemaType getSchemaType() {
        return contextHolder.get();
    }

    public static void clear() {
        contextHolder.remove();
    }
}


b - 切换数据源

需要切换数据源的时候SchemaContextHolder.setSchemaType(SchemaType.MASTER);完成后调用clear()即可。比如:
    @GetMapping("findall")
    public List<User> findall(@RequestParam("ds") String ds) {
        if(ds.equals("master")) {
            SchemaContextHolder.setSchemaType(SchemaType.MASTER);
        } else {
            SchemaContextHolder.setSchemaType(SchemaType.SLAVE);
        }
        return userService.findAll();
    }


通过Interceptor实现切换数据源。

public class DatasourceInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if(!StringUtils.isEmpty(request.getSession().getAttribute("datasource"))){
            SchemaContextHolder.setSchemaType((SchemaType)request.getSession().getAttribute("datasource"));
        }
        return true;
    }

}


@Component
@Configuration
public class DatasourceConfig {
    // ...
    @Bean
    public HandlerInterceptor datasourceInterceptor(){
        return new DatasourceInterceptor();
    }

    @Bean
    public MappedInterceptor interceptorMapping(){
        return new MappedInterceptor(new String[]{"/**"}, datasourceInterceptor());
    }
    // ...
}


通过修改Session个中的值即可切换数据库: request.getSession().setAttribute("datasource", type);

(4)基于package指定数据源
上边已经可以获取到多个Datasource,那么就可以通过DataSource生成不同的SqlSessionFactoryBean,通过@MapperScan为不同的package指定不同的SqlSessionFactoryBean。

https://github.com/mybatis/spring-boot-starter/issues/78

@MapperScan(basePackages = "com.rensanning.springboot.mappers.cmn", sqlSessionFactoryRef = CmnDatasourceConfig.SQL_SESSION_FACTORY_NAME)

@MapperScan(basePackages = "com.rensanning.springboot.mappers.user", sqlSessionFactoryRef = UsrDatasourceConfig.SQL_SESSION_FACTORY_NAME)


(5)通过数据库管理数据源
上边场景基本都是所有数据库信息都已知,可在代码(或application.properties)中固定配置!还有一种很常见的场景是用户登录时使用一个数据源,但是登录后的数据源需要通过从DB中取得,需要能实时更新DataSource路由。可以通过自己实现AbstractDataSource来自己对数据源的创建和获取等管理操作。
具体参考附件代码:点击下载

参考:
http://qiita.com/syukai/items/0d4bf27f82fef9965cdd
http://qiita.com/kazuki43zoo/items/9d8aec0ecab117a4d5c1
分享到:
评论

相关推荐

    spring-boot-api-project-seed-master.zip

    本篇文章将围绕"spring-boot-api-project-seed-master.zip"这个压缩包文件,深入探讨Spring Boot的核心特性、API设计原则以及如何通过这个项目种子进行实战演练。 1. **Spring Boot概述** Spring Boot是由Pivotal ...

    精进-Spring-Boot-面试题1

    4. 自动配置 Spring Bean:Spring Boot 根据项目依赖自动配置相关组件,如发现数据库驱动会自动配置数据源,找到 Spring MVC 相关依赖则自动配置 MVC 配置。 5. 准生产级别的应用监控:Spring Boot Actuator 提供了...

    dynamic-datasource-spring-boot-starter-master.zip

    本篇文章将深入探讨如何使用SpringBoot实现动态数据源切换,并实现主从分离,以及"dynamic-datasource-spring-boot-starter-master.zip"这个项目中的核心知识点。 首先,我们需要理解“动态数据源”的概念。动态...

    spring-boot-api-project.zip

    一、Spring Boot基础 Spring Boot是Spring框架的简化版,旨在简化Spring应用的初始搭建以及开发过程。它默认配置了许多常见的设置,如Tomcat服务器、Spring Data JPA等,开发者只需通过少量代码或配置就能快速启动...

    spring-boot-study-master.zip

    Spring Boot简化了Spring应用程序的初始设置和配置,它默认配置了很多常见的功能,如数据源、Tomcat服务器、日志系统等,使得开发者可以专注于业务代码而非基础框架的搭建。 2. **Druid数据源**: Druid是阿里...

    Spring boot 入门实例

    例如,添加了JDBC相关依赖,Spring Boot会自动配置数据源和JdbcTemplate。 4. **健康检查与Actuator**:提供健康检查、监控和管理端点,方便微服务的运维。 5. **命令行接口(CLI)**:提供了命令行工具,用于快速...

    spring boot入门篇demo+ppt

    1. **Spring Boot基础知识**:了解Spring Boot的基本概念,包括其设计目标、主要特性以及与其他Spring框架的关系。 2. **起步依赖(Starter)**:Spring Boot通过起步依赖提供了一种快速配置各种功能的方式,如Web...

    Spring-mvc Srping-boot spring-jdbc

    Spring Boot通过“起步依赖”(Starter POMs)来自动配置项目所需的各种组件,如数据源、日志、安全等,大大减少了XML配置。同时,Spring Boot还提供了Actuator端点,用于监控和管理应用程序的健康状态和性能指标。 ...

    spring boot多数据源

    总的来说,Spring Boot的多数据源配置为开发者提供了灵活处理多种数据库的需求,结合Maven的强大依赖管理功能,使得项目构建和维护变得更加简单。在实际开发中,理解并熟练运用这些技术,能够有效提升项目的可扩展性...

    druid 和 druid-spring-boot-starter 1.1.13 版本和 1.2.8 版本的 jar 包

    Druid 和 Druid-Spring-Boot- Starter 是 Java 开发中常用的数据源管理组件,它们在数据库连接池管理和监控方面发挥着重要作用。这篇文档将详细介绍这两个组件的功能、用途以及它们在不同版本之间的差异。 首先,...

    spring-boot-mybatis-test.rar

    本篇文章将深入探讨在Spring Boot项目中集成Mybatis时可能会遇到的问题及解决方案。 首先,我们需要在项目中引入Mybatis的相关依赖。在`pom.xml`文件中添加Mybatis、Mybatis-Spring-Boot-Starter以及数据库驱动的...

    springboot+mybatis-plus集成

    5. **配置数据源**:在Spring Boot中,我们需要配置数据源。可以使用`@Bean`注解创建DataSource,或者在YAML/Properties文件中配置。 6. **配置SqlSessionFactory**:创建SqlSessionFactory,并使用`@Bean`注解进行...

    spring-boot-cloud-master.zip

    本篇将深入探讨基于Spring Boot、Spring Cloud、Spring Oauth2以及Spring Cloud Netflix等技术栈构建的微服务项目。我们将从基础概念出发,逐步剖析各个组件的功能与实现方式,帮助读者全面掌握这一领域的知识。 ...

    spring boot 多数据源

    本篇文章将深入探讨Spring Boot如何实现多数据源的配置,并通过源码分析增强我们的理解。 首先,我们要明白什么是数据源。在Java世界中,数据源通常指的是JDBC DataSource,它是Java中用于管理数据库连接的接口。在...

    spring-boot-2.3.8.RELEAS demo.zip

    《Spring Boot 2.3.8.RELEASE:深入探索与实战》 Spring Boot作为Java开发中的热门框架...通过实际操作,可以深入了解Spring Boot的自动配置、依赖注入、Web开发、健康检查等核心特性,为日后的开发工作打下坚实基础。

    springboot380闲置图书分享boot--论文pf.zip

    例如,如果项目中有JDBC的依赖,Spring Boot将自动配置数据源和JdbcTemplate,无需手动编写大量配置代码。 **起步依赖(Starters)** Spring Boot通过起步依赖提供了一种简单的方式来添加所需的Spring及其相关库。...

    spring boot搭建(二)

    在上一部分中,我们可能已经介绍了Spring Boot的基础知识和快速入门。在此阶段,我们将更进一步,通过代码示例深入了解Spring Boot的核心特性以及如何集成常用的数据库连接池Druid和SQL监控工具P6Spy。 首先,...

    官方原版源码spring-framework-4.3.25.RELEASE.zip

    本篇文章将聚焦于Spring Framework 4.3.25.RELEASE的官方源码,深入探讨其内部机制,帮助读者更全面地理解这一版本的精髓。 1. **Spring Framework概述** Spring Framework是Java企业级应用开发的基石,它提供了一...

    spring boot搭建(三)

    一、Spring Boot基础 Spring Boot的核心特性在于“约定优于配置”,它通过预设默认配置来减少项目初始化的工作量。只需几行代码,就能启动一个包含基础功能的Web应用。Spring Initializr(start.spring.io)是一个...

Global site tag (gtag.js) - Google Analytics