- 浏览: 3552533 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:38217
-
Cordova 3.x入门...
浏览量:607585
-
常用Java开源Libra...
浏览量:682772
-
搭建 CentOS 6 服...
浏览量:89526
-
Spring Boot 入...
浏览量:402121
-
基于Spring Secu...
浏览量:69759
-
MQTT入门
浏览量:91834
文章分类
最新评论
-
afateg:
阿里云的图是怎么画出来的?用什么工具?
各云服务平台的架构图 -
cbn_1992:
博主,采用jdbctoken也就是数据库形式之后,反复点击获取 ...
Spring Security OAuth2 Provider 之 数据库存储 -
ipodao:
写的很是清楚了,我找到一份中文协议:https://mcxia ...
MQTT入门(6)- 主题Topics -
Cavani_cc:
还行
MQTT入门(6)- 主题Topics -
fexiong:
博主,能否提供完整源码用于学习?邮箱:2199611997@q ...
TensorFlow 之 构建人物识别系统
(1)单一数据源
默认Spring Boot会在classpath中查找H2, HSQL, Derby等内存数据库的jar包自动配置一个内存数据库的DataSource。
但如果在application.properties中设置了spring.datasource.*相关的信息,Spring Boot会自定使用该设置自动配置DataSource。
(2)多个数据源
数据源不局限于数据库:
使用@Autowired注入时会首先使用被标记为@Primary的Bean。
(3)动态数据源
Spring提供org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource来支持DataSource路由配置,具体可以参考官网Blog:https://spring.io/blog/2007/01/23/dynamic-datasource-routing/
a - 定义配置
b - 切换数据源
需要切换数据源的时候SchemaContextHolder.setSchemaType(SchemaType.MASTER);完成后调用clear()即可。比如:
通过Interceptor实现切换数据源。
通过修改Session个中的值即可切换数据库: request.getSession().setAttribute("datasource", type);
(4)基于package指定数据源
上边已经可以获取到多个Datasource,那么就可以通过DataSource生成不同的SqlSessionFactoryBean,通过@MapperScan为不同的package指定不同的SqlSessionFactoryBean。
https://github.com/mybatis/spring-boot-starter/issues/78
(5)通过数据库管理数据源
上边场景基本都是所有数据库信息都已知,可在代码(或application.properties)中固定配置!还有一种很常见的场景是用户登录时使用一个数据源,但是登录后的数据源需要通过从DB中取得,需要能实时更新DataSource路由。可以通过自己实现AbstractDataSource来自己对数据源的创建和获取等管理操作。
具体参考附件代码:点击下载
参考:
http://qiita.com/syukai/items/0d4bf27f82fef9965cdd
http://qiita.com/kazuki43zoo/items/9d8aec0ecab117a4d5c1
默认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
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
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
- DynamicDS.zip (71.9 KB)
- 下载次数: 39
发表评论
-
Spring Boot 入门 - 进阶篇(8)- 应用监控(Actuator)
2017-03-16 14:57 17590作为Spring Boot的另外一大亮点,就是actuator ... -
Spring Boot 入门 - 进阶篇(7)- 自动配置(AutoConfigure)
2017-03-16 11:05 62280自动配置是Spring Boot的最大亮点,完美的展示了CoC ... -
Spring Boot 入门 - 进阶篇(6)- 启动加载(CommandLineRunner)
2017-03-15 15:04 15109启动成功后可以通过以下方法运行自己的初始代码: @PostCo ... -
Spring Boot 入门 - 进阶篇(5)- 数据缓存(@Cacheable)
2017-03-14 16:28 34686缓存可以缓解数据库访 ... -
Spring Boot 入门 - 进阶篇(4)- REST访问(RestTemplate)
2017-03-14 11:07 45308经常需要发送一个GET/POST请求到其他系统(REST AP ... -
Spring Boot 入门 - 进阶篇(3)- 定时任务(@Scheduled)
2017-03-13 13:23 23780主要用于定时发送邮件、夜间自动维护等。 (1)开启定时任务功 ... -
Spring Boot 入门 - 进阶篇(2)- 异步调用(@Async)
2017-03-07 15:59 20095异步处理 Java的异步处理Thread/Runnable、 ... -
Spring Boot 入门 - 进阶篇(1)- Servlet、Filter、Listener、Interceptor
2017-03-07 10:39 10629用户认证授权、日志记录MDC、编码解码、UA检查、多端对应等都 ... -
Spring Boot 入门 - 基础篇(15)- 工程部署
2017-02-16 15:31 9056(1)开发阶段 一般开发过程: 1)-写代码 2)- [Ru ... -
Spring Boot 入门 - 基础篇(14)- 参数设置
2017-02-16 15:25 5741(1)读取优先顺序 a - 命令行参数 --key=val ... -
Spring Boot 入门 - 基础篇(13)- 异常处理
2017-02-16 10:23 8676先要了解Spring的异常处理:http://rensanni ... -
Spring Boot 入门 - 基础篇(12)- 数据校验
2017-02-16 09:53 19937除过在客户端做JavaScript数据校验外,服务器端做数据校 ... -
Spring Boot 入门 - 基础篇(10)- 发送邮件
2017-02-14 10:04 2488(1)配置 pom.xml <dependency> ... -
Spring Boot 入门 - 基础篇(9)- 文件上传下载
2017-02-14 10:01 15900(1)单文件上传 Form方式 <form id=&qu ... -
Spring Boot 入门 - 基础篇(8)- 数据库操作
2017-02-10 16:17 8679(1)导入mybatis-spring-boot-starte ... -
Spring Boot 入门 - 基础篇(7)- 国际化
2017-02-10 13:58 13149Spring Boot默认支持国际化配置,只需要添加配置文件即 ... -
Spring Boot 入门 - 基础篇(6)- 页面模板
2017-02-09 15:00 6480Spring Boot支持很多模板引擎,但嵌入式容器JSP有限 ... -
Spring Boot 入门 - 基础篇(5)- 使用WebJars
2017-02-09 14:20 11750WebJars能使Maven的依赖管理支持OSS的JavaSc ... -
Spring Boot 入门 - 基础篇(4)- 静态资源
2017-02-09 13:10 10708静态资源包括:HTML、CSS、JS、图像、视频、PDF/Of ... -
Spring Boot 入门 - 基础篇(3)- 日志管理
2017-02-09 09:39 8486Spring Boot支持JUL,Log4J2和Logback ...
相关推荐
本篇文章将围绕"spring-boot-api-project-seed-master.zip"这个压缩包文件,深入探讨Spring Boot的核心特性、API设计原则以及如何通过这个项目种子进行实战演练。 1. **Spring Boot概述** Spring Boot是由Pivotal ...
4. 自动配置 Spring Bean:Spring Boot 根据项目依赖自动配置相关组件,如发现数据库驱动会自动配置数据源,找到 Spring MVC 相关依赖则自动配置 MVC 配置。 5. 准生产级别的应用监控:Spring Boot Actuator 提供了...
本篇文章将深入探讨如何使用SpringBoot实现动态数据源切换,并实现主从分离,以及"dynamic-datasource-spring-boot-starter-master.zip"这个项目中的核心知识点。 首先,我们需要理解“动态数据源”的概念。动态...
一、Spring Boot基础 Spring Boot是Spring框架的简化版,旨在简化Spring应用的初始搭建以及开发过程。它默认配置了许多常见的设置,如Tomcat服务器、Spring Data JPA等,开发者只需通过少量代码或配置就能快速启动...
Spring Boot简化了Spring应用程序的初始设置和配置,它默认配置了很多常见的功能,如数据源、Tomcat服务器、日志系统等,使得开发者可以专注于业务代码而非基础框架的搭建。 2. **Druid数据源**: Druid是阿里...
例如,添加了JDBC相关依赖,Spring Boot会自动配置数据源和JdbcTemplate。 4. **健康检查与Actuator**:提供健康检查、监控和管理端点,方便微服务的运维。 5. **命令行接口(CLI)**:提供了命令行工具,用于快速...
1. **Spring Boot基础知识**:了解Spring Boot的基本概念,包括其设计目标、主要特性以及与其他Spring框架的关系。 2. **起步依赖(Starter)**:Spring Boot通过起步依赖提供了一种快速配置各种功能的方式,如Web...
Spring Boot通过“起步依赖”(Starter POMs)来自动配置项目所需的各种组件,如数据源、日志、安全等,大大减少了XML配置。同时,Spring Boot还提供了Actuator端点,用于监控和管理应用程序的健康状态和性能指标。 ...
总的来说,Spring Boot的多数据源配置为开发者提供了灵活处理多种数据库的需求,结合Maven的强大依赖管理功能,使得项目构建和维护变得更加简单。在实际开发中,理解并熟练运用这些技术,能够有效提升项目的可扩展性...
Druid 和 Druid-Spring-Boot- Starter 是 Java 开发中常用的数据源管理组件,它们在数据库连接池管理和监控方面发挥着重要作用。这篇文档将详细介绍这两个组件的功能、用途以及它们在不同版本之间的差异。 首先,...
本篇文章将深入探讨在Spring Boot项目中集成Mybatis时可能会遇到的问题及解决方案。 首先,我们需要在项目中引入Mybatis的相关依赖。在`pom.xml`文件中添加Mybatis、Mybatis-Spring-Boot-Starter以及数据库驱动的...
5. **配置数据源**:在Spring Boot中,我们需要配置数据源。可以使用`@Bean`注解创建DataSource,或者在YAML/Properties文件中配置。 6. **配置SqlSessionFactory**:创建SqlSessionFactory,并使用`@Bean`注解进行...
本篇将深入探讨基于Spring Boot、Spring Cloud、Spring Oauth2以及Spring Cloud Netflix等技术栈构建的微服务项目。我们将从基础概念出发,逐步剖析各个组件的功能与实现方式,帮助读者全面掌握这一领域的知识。 ...
本篇文章将深入探讨Spring Boot如何实现多数据源的配置,并通过源码分析增强我们的理解。 首先,我们要明白什么是数据源。在Java世界中,数据源通常指的是JDBC DataSource,它是Java中用于管理数据库连接的接口。在...
《Spring Boot 2.3.8.RELEASE:深入探索与实战》 Spring Boot作为Java开发中的热门框架...通过实际操作,可以深入了解Spring Boot的自动配置、依赖注入、Web开发、健康检查等核心特性,为日后的开发工作打下坚实基础。
例如,如果项目中有JDBC的依赖,Spring Boot将自动配置数据源和JdbcTemplate,无需手动编写大量配置代码。 **起步依赖(Starters)** Spring Boot通过起步依赖提供了一种简单的方式来添加所需的Spring及其相关库。...
在上一部分中,我们可能已经介绍了Spring Boot的基础知识和快速入门。在此阶段,我们将更进一步,通过代码示例深入了解Spring Boot的核心特性以及如何集成常用的数据库连接池Druid和SQL监控工具P6Spy。 首先,...
本篇文章将聚焦于Spring Framework 4.3.25.RELEASE的官方源码,深入探讨其内部机制,帮助读者更全面地理解这一版本的精髓。 1. **Spring Framework概述** Spring Framework是Java企业级应用开发的基石,它提供了一...
一、Spring Boot基础 Spring Boot的核心特性在于“约定优于配置”,它通过预设默认配置来减少项目初始化的工作量。只需几行代码,就能启动一个包含基础功能的Web应用。Spring Initializr(start.spring.io)是一个...