96SEO 2026-02-20 02:07 0
。

在许多情况下#xff0c;我们需要同时操作多个数据库#xff0c;或者需要将不同类型的数据存储在不…1.
仓库地址https://gitee.com/aopmin/multi-datasource-demo
随着项目规模的扩大和业务需求的复杂化单一数据源已经不能满足实际开发中的需求。
在许多情况下我们需要同时操作多个数据库或者需要将不同类型的数据存储在不同的数据库中。
这时多数据源场景成为必不可少的解决方案。
方案1基于Spring框架提供的AbstractRoutingDataSource。
简单易用支持动态切换数据源适用于少量数据源情况。
场景适用于需要动态切换数据源且数据库较少的情况。
文档地址
方案2使用MP提供的Dynamic-datasource多数据源框架。
文档地址https://baomidou.com/guides/dynamic-datasource/#dynamic-datasource
方案3通过自定义注解在方法或类上指定数据源实现根据注解切换数据源的功能。
适用于需要在代码层面进行数据源切换并对数据源切换有精细要求的情况。
方案4使用动态代理技术在运行时动态切换数据源实现多数据源的切换。
灵活性高支持在运行时动态切换数据源适合对数据源切换的逻辑有特殊需求的情况。
场景
1、执行sql脚本(分别创建两个数据库里面都提供一张user表)
parentgroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-parent/artifactIdversion2.7.10/versionrelativePath/
/parentdependencies!--jdbc起步依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId
/dependency!--test起步依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-test/artifactId/dependency!--mysql驱动--dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion8.0.20/version/dependency!--lombok--dependencygroupIdorg.projectlombok/groupIdartifactIdlombok/artifactId/dependency!--jdbc起步依赖--dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-jdbc/artifactId/dependency
spring:#动态数据源配置datasource:ds1:driverClassName:
com.mysql.cj.jdbc.DriverjdbcUrl:
jdbc:mysql://localhost:3306/ds1?serverTimezoneAsia/ShanghaiuseUnicodetruecharacterEncodingutf8useSSLfalseusername:
com.mysql.cj.jdbc.DriverjdbcUrl:
jdbc:mysql://localhost:3306/ds2?serverTimezoneAsia/ShanghaiuseUnicodetruecharacterEncodingutf8useSSLfalseusername:
org.springframework.beans.factory.annotation.Qualifier;
org.springframework.boot.context.properties.ConfigurationProperties;
org.springframework.boot.jdbc.DataSourceBuilder;
org.springframework.context.annotation.Bean;
org.springframework.context.annotation.Configuration;
org.springframework.jdbc.core.JdbcTemplate;import
{//定义数据源1Bean(ds1)ConfigurationProperties(prefix
DataSourceBuilder.create().build();}//定义数据源2Bean(ds2)ConfigurationProperties(prefix
DataSourceBuilder.create().build();}//定义动态数据源Bean(name
dynamicDataSource(Qualifier(ds1)
HashMap();targetDataSources.put(ds1,
ds1);targetDataSources.put(ds2,
ds2);//2.实例化自定义的DynamicDataSource对象,
DynamicDataSource();dynamicDataSource.setTargetDataSources(targetDataSources);//3.设置默认数据源,未匹配上则使用默认数据源dynamicDataSource.setDefaultTargetDataSource(ds1);return
jdbcTemplate(Qualifier(dataSource)
cn.aopmin.common.DataSourceContextHolder;
org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;/***
AbstractRoutingDataSource(抽象的数据源路由器)
当应用程序需要访问数据库的时候,AbstractRoutingDataSource会根据某种匹配规则例如请求参数、用户身份等来选择一个合适的数据源*
DataSourceContextHolder.getDataSource();}
{contextHolder.set(dataSourceName);}//
org.springframework.boot.SpringApplication;
org.springframework.boot.autoconfigure.SpringBootApplication;/***
{SpringApplication.run(Demo01Application.class,
cn.aopmin.common.DataSourceContextHolder;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.jdbc.core.JdbcTemplate;
org.springframework.stereotype.Service;/***
todo:自定义注解SpringAop实现数据源的切换DataSourceContextHolder.setDataSource(ds1);String
values(?,?);jdbcTemplate.update(sql,user.getUsername(),
{DataSourceContextHolder.clearDataSource();}}public
{DataSourceContextHolder.setDataSource(ds2);String
values(?,?);jdbcTemplate.update(sql,user.getUsername(),
{DataSourceContextHolder.clearDataSource();}}
org.springframework.boot.test.context.SpringBootTest;import
javax.annotation.Resource;SpringBootTest(classes
User();user.setUsername(jack);user.setGender(0);user.setGender(1);userService.insertDs1(user);}Testpublic
User();user.setUsername(rose);user.setGender(1);userService.insertDs2(user);}
mp文档https://baomidou.com/guides/dynamic-datasource/#_top
1、创建SpringBoot工程引入Dynamic-datasource依赖
dependencygroupIdcom.baomidou/groupIdartifactIddynamic-datasource-spring-boot-starter/artifactIdversion3.5.2/version
spring:#多数据源配置datasource:dynamic:primary:
#是否严格检查动态数据源提供的数据库名datasource:#数据源1master:url:
jdbc:mysql:///ds1?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghaiusername:
com.mysql.cj.jdbc.Driver#数据源2slave1:url:
jdbc:mysql:///ds2?useUnicodetruecharacterEncodingutf-8useSSLfalseserverTimezoneAsia/Shanghaiusername:
com.baomidou.dynamic.datasource.annotation.DS;
org.springframework.beans.factory.annotation.Autowired;
org.springframework.jdbc.core.JdbcTemplate;
org.springframework.stereotype.Service;/***
values(?,?);jdbcTemplate.update(sql,user.getUsername(),
user.getGender());}DS(slave1)public
values(?,?);jdbcTemplate.update(sql,user.getUsername(),
org.springframework.boot.test.context.SpringBootTest;import
javax.annotation.Resource;SpringBootTest
User();user.setUsername(jack);user.setGender(0);user.setGender(1);userService.insertDs1(user);}Testpublic
User();user.setUsername(rose);user.setGender(1);userService.insertDs2(user);}
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback