- 浏览: 3515665 次
- 性别:
- 来自: 大连
博客专栏
-
使用Titanium Mo...
浏览量:37520
-
Cordova 3.x入门...
浏览量:604437
-
常用Java开源Libra...
浏览量:678250
-
搭建 CentOS 6 服...
浏览量:87365
-
Spring Boot 入...
浏览量:399903
-
基于Spring Secu...
浏览量:69093
-
MQTT入门
浏览量:90539
文章分类
最新评论
-
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 17507作为Spring Boot的另外一大亮点,就是actuator ... -
Spring Boot 入门 - 进阶篇(7)- 自动配置(AutoConfigure)
2017-03-16 11:05 62140自动配置是Spring Boot的最大亮点,完美的展示了CoC ... -
Spring Boot 入门 - 进阶篇(6)- 启动加载(CommandLineRunner)
2017-03-15 15:04 14981启动成功后可以通过以下方法运行自己的初始代码: @PostCo ... -
Spring Boot 入门 - 进阶篇(5)- 数据缓存(@Cacheable)
2017-03-14 16:28 34570缓存可以缓解数据库访 ... -
Spring Boot 入门 - 进阶篇(4)- REST访问(RestTemplate)
2017-03-14 11:07 45179经常需要发送一个GET/POST请求到其他系统(REST AP ... -
Spring Boot 入门 - 进阶篇(3)- 定时任务(@Scheduled)
2017-03-13 13:23 23656主要用于定时发送邮件、夜间自动维护等。 (1)开启定时任务功 ... -
Spring Boot 入门 - 进阶篇(2)- 异步调用(@Async)
2017-03-07 15:59 20005异步处理 Java的异步处理Thread/Runnable、 ... -
Spring Boot 入门 - 进阶篇(1)- Servlet、Filter、Listener、Interceptor
2017-03-07 10:39 10549用户认证授权、日志记录MDC、编码解码、UA检查、多端对应等都 ... -
Spring Boot 入门 - 基础篇(15)- 工程部署
2017-02-16 15:31 8995(1)开发阶段 一般开发过程: 1)-写代码 2)- [Ru ... -
Spring Boot 入门 - 基础篇(14)- 参数设置
2017-02-16 15:25 5680(1)读取优先顺序 a - 命令行参数 --key=val ... -
Spring Boot 入门 - 基础篇(13)- 异常处理
2017-02-16 10:23 8610先要了解Spring的异常处理:http://rensanni ... -
Spring Boot 入门 - 基础篇(12)- 数据校验
2017-02-16 09:53 19768除过在客户端做JavaScript数据校验外,服务器端做数据校 ... -
Spring Boot 入门 - 基础篇(10)- 发送邮件
2017-02-14 10:04 2433(1)配置 pom.xml <dependency> ... -
Spring Boot 入门 - 基础篇(9)- 文件上传下载
2017-02-14 10:01 15793(1)单文件上传 Form方式 <form id=&qu ... -
Spring Boot 入门 - 基础篇(8)- 数据库操作
2017-02-10 16:17 8608(1)导入mybatis-spring-boot-starte ... -
Spring Boot 入门 - 基础篇(7)- 国际化
2017-02-10 13:58 13077Spring Boot默认支持国际化配置,只需要添加配置文件即 ... -
Spring Boot 入门 - 基础篇(6)- 页面模板
2017-02-09 15:00 6401Spring Boot支持很多模板引擎,但嵌入式容器JSP有限 ... -
Spring Boot 入门 - 基础篇(5)- 使用WebJars
2017-02-09 14:20 11667WebJars能使Maven的依赖管理支持OSS的JavaSc ... -
Spring Boot 入门 - 基础篇(4)- 静态资源
2017-02-09 13:10 10649静态资源包括:HTML、CSS、JS、图像、视频、PDF/Of ... -
Spring Boot 入门 - 基础篇(3)- 日志管理
2017-02-09 09:39 8423Spring Boot支持JUL,Log4J2和Logback ...
相关推荐
赠送源代码:spring-boot-actuator-autoconfigure-2.3.12.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-boot-actuator-autoconfigure-2.3.12.RELEASE.pom; 包含翻译后的API文档:spring-boot-actuator-...
赠送源代码:seata-spring-boot-starter-1.3.0-sources.jar; 赠送Maven依赖信息文件:seata-spring-boot-starter-1.3.0.pom; 包含翻译后的API文档:seata-spring-boot-starter-1.3.0-javadoc-API文档-中文(简体)版...
赠送源代码:spring-boot-configuration-processor-2.6.3-sources.jar; 赠送Maven依赖信息文件:spring-boot-configuration-processor-2.6.3.pom; 包含翻译后的API文档:spring-boot-configuration-processor-...
赠送源代码:spring-boot-configuration-processor-2.3.12.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-boot-configuration-processor-2.3.12.RELEASE.pom; 包含翻译后的API文档:spring-boot-...
赠送源代码:mybatis-spring-boot-autoconfigure-1.3.2-sources.jar; 赠送Maven依赖信息文件:mybatis-spring-boot-autoconfigure-1.3.2.pom; 包含翻译后的API文档:mybatis-spring-boot-autoconfigure-1.3.2-...
赠送源代码:druid-spring-boot-starter-1.1.9-sources.jar; 赠送Maven依赖信息文件:druid-spring-boot-starter-1.1.9.pom; 包含翻译后的API文档:druid-spring-boot-starter-1.1.9-javadoc-API文档-中文(简体)版...
赠送源代码:aliyun-sms-spring-boot-starter-2.0.2-sources.jar 包含翻译后的API文档:aliyun-sms-spring-boot-starter-2.0.2-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:io.springboot.sms,...
赠送源代码:spring-boot-configuration-processor-2.5.6-sources.jar; 赠送Maven依赖信息文件:spring-boot-configuration-processor-2.5.6.pom; 包含翻译后的API文档:spring-boot-configuration-processor-...
赠送源代码:spring-boot-autoconfigure-2.3.12.RELEASE-sources.jar; 赠送Maven依赖信息文件:spring-boot-autoconfigure-2.3.12.RELEASE.pom; 包含翻译后的API文档:spring-boot-autoconfigure-2.3.12.RELEASE-...
赠送源代码:druid-spring-boot-starter-1.1.10-sources.jar; 赠送Maven依赖信息文件:druid-spring-boot-starter-1.1.10.pom; 包含翻译后的API文档:druid-spring-boot-starter-1.1.10-javadoc-API文档-中文(简体...
赠送源代码:nacos-config-spring-boot-autoconfigure-0.2.7-sources.jar; 赠送Maven依赖信息文件:nacos-config-spring-boot-autoconfigure-0.2.7.pom; 包含翻译后的API文档:nacos-config-spring-boot-...
赠送源代码:oss-spring-boot-starter-1.0.3-sources.jar; 赠送Maven依赖信息文件:oss-spring-boot-starter-1.0.3.pom; 包含翻译后的API文档:oss-spring-boot-starter-1.0.3-javadoc-API文档-中文(简体)-英语-...
赠送源代码:dynamic-datasource-spring-boot-starter-3.4.1-sources.jar; 赠送Maven依赖信息文件:dynamic-datasource-spring-boot-starter-3.4.1.pom; 包含翻译后的API文档:dynamic-datasource-spring-boot-...
赠送源代码:dynamic-datasource-spring-boot-starter-3.4.1-sources.jar; 赠送Maven依赖信息文件:dynamic-datasource-spring-boot-starter-3.4.1.pom; 包含翻译后的API文档:dynamic-datasource-spring-boot-...
赠送源代码:oss-spring-boot-starter-1.0.3-sources.jar 包含翻译后的API文档:oss-spring-boot-starter-1.0.3-javadoc-API文档-中文(简体)版.zip 对应Maven信息:groupId:com.pig4cloud.plugin,artifactId:oss...
赠送源代码:druid-spring-boot-starter-1.2.8-sources.jar; 赠送Maven依赖信息文件:druid-spring-boot-starter-1.2.8.pom; 包含翻译后的API文档:druid-spring-boot-starter-1.2.8-javadoc-API文档-中文(简体)版...
赠送源代码:druid-spring-boot-starter-1.1.9-sources.jar; 赠送Maven依赖信息文件:druid-spring-boot-starter-1.1.9.pom; 包含翻译后的API文档:druid-spring-boot-starter-1.1.9-javadoc-API文档-中文(简体)-...
赠送源代码:spring-boot-admin-server-ui-2.5.2-sources.jar; 赠送Maven依赖信息文件:spring-boot-admin-server-ui-2.5.2.pom; 包含翻译后的API文档:spring-boot-admin-server-ui-2.5.2-javadoc-API文档-中文...
赠送源代码:aliyun-sms-spring-boot-starter-2.0.2-sources.jar; 赠送Maven依赖信息文件:aliyun-sms-spring-boot-starter-2.0.2.pom; 包含翻译后的API文档:aliyun-sms-spring-boot-starter-2.0.2-javadoc-API...