当前位置: 首页 > news >正文

制作网站设计的总结衡水网站建设设计

制作网站设计的总结,衡水网站建设设计,政协系统网站建设,iis网站创建向导ShardingSphere 与 Spring 动态数据源切换机制的对比及原理 一、核心定位对比 维度ShardingSphereSpring动态数据源#xff08;如 AbstractRoutingDataSource#xff09;定位分布式数据库中间件轻量级多数据源路由工具核心目标分库分表、读写分离、分布式事务多数据源动态切…ShardingSphere 与 Spring 动态数据源切换机制的对比及原理 一、核心定位对比 维度ShardingSphereSpring动态数据源如 AbstractRoutingDataSource定位分布式数据库中间件轻量级多数据源路由工具核心目标分库分表、读写分离、分布式事务多数据源动态切换适用场景大数据量、高并发、复杂分片需求简单多数据源隔离如多租户、环境隔离实现层级JDBC 驱动层拦截并改写 SQL应用层基于 Spring AOP 或手动切换 二、核心原理剖析 1. ShardingSphere 实现原理 #mermaid-svg-wQGm87ggz4qzhTaT {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-wQGm87ggz4qzhTaT .error-icon{fill:#552222;}#mermaid-svg-wQGm87ggz4qzhTaT .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-wQGm87ggz4qzhTaT .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-wQGm87ggz4qzhTaT .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-wQGm87ggz4qzhTaT .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-wQGm87ggz4qzhTaT .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-wQGm87ggz4qzhTaT .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-wQGm87ggz4qzhTaT .marker{fill:#333333;stroke:#333333;}#mermaid-svg-wQGm87ggz4qzhTaT .marker.cross{stroke:#333333;}#mermaid-svg-wQGm87ggz4qzhTaT svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-wQGm87ggz4qzhTaT .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-wQGm87ggz4qzhTaT .cluster-label text{fill:#333;}#mermaid-svg-wQGm87ggz4qzhTaT .cluster-label span{color:#333;}#mermaid-svg-wQGm87ggz4qzhTaT .label text,#mermaid-svg-wQGm87ggz4qzhTaT span{fill:#333;color:#333;}#mermaid-svg-wQGm87ggz4qzhTaT .node rect,#mermaid-svg-wQGm87ggz4qzhTaT .node circle,#mermaid-svg-wQGm87ggz4qzhTaT .node ellipse,#mermaid-svg-wQGm87ggz4qzhTaT .node polygon,#mermaid-svg-wQGm87ggz4qzhTaT .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-wQGm87ggz4qzhTaT .node .label{text-align:center;}#mermaid-svg-wQGm87ggz4qzhTaT .node.clickable{cursor:pointer;}#mermaid-svg-wQGm87ggz4qzhTaT .arrowheadPath{fill:#333333;}#mermaid-svg-wQGm87ggz4qzhTaT .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-wQGm87ggz4qzhTaT .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-wQGm87ggz4qzhTaT .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-wQGm87ggz4qzhTaT .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-wQGm87ggz4qzhTaT .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-wQGm87ggz4qzhTaT .cluster text{fill:#333;}#mermaid-svg-wQGm87ggz4qzhTaT .cluster span{color:#333;}#mermaid-svg-wQGm87ggz4qzhTaT div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-wQGm87ggz4qzhTaT :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 是 否 应用层 ShardingSphere-JDBC SQL解析引擎 是否分片? 路由引擎 直连默认数据源 分片规则匹配 目标数据源列表 SQL改写 物理连接获取 多线程执行 结果归并 返回统一结果 关键特性 JDBC 驱动层拦截通过自定义 JDBC 驱动拦截 SQL实现透明化分片SQL 改写引擎自动将逻辑表名改写为物理表名如 user → user_001分布式主键生成内置 Snowflake 等算法生成全局唯一 ID读写分离路由自动区分读写操作路由到主库或从库 2. Spring 动态数据源实现原理 #mermaid-svg-35sIsM0pfeseWd05 {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-35sIsM0pfeseWd05 .error-icon{fill:#552222;}#mermaid-svg-35sIsM0pfeseWd05 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-35sIsM0pfeseWd05 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-35sIsM0pfeseWd05 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-35sIsM0pfeseWd05 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-35sIsM0pfeseWd05 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-35sIsM0pfeseWd05 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-35sIsM0pfeseWd05 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-35sIsM0pfeseWd05 .marker.cross{stroke:#333333;}#mermaid-svg-35sIsM0pfeseWd05 svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-35sIsM0pfeseWd05 .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-35sIsM0pfeseWd05 .cluster-label text{fill:#333;}#mermaid-svg-35sIsM0pfeseWd05 .cluster-label span{color:#333;}#mermaid-svg-35sIsM0pfeseWd05 .label text,#mermaid-svg-35sIsM0pfeseWd05 span{fill:#333;color:#333;}#mermaid-svg-35sIsM0pfeseWd05 .node rect,#mermaid-svg-35sIsM0pfeseWd05 .node circle,#mermaid-svg-35sIsM0pfeseWd05 .node ellipse,#mermaid-svg-35sIsM0pfeseWd05 .node polygon,#mermaid-svg-35sIsM0pfeseWd05 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-35sIsM0pfeseWd05 .node .label{text-align:center;}#mermaid-svg-35sIsM0pfeseWd05 .node.clickable{cursor:pointer;}#mermaid-svg-35sIsM0pfeseWd05 .arrowheadPath{fill:#333333;}#mermaid-svg-35sIsM0pfeseWd05 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-35sIsM0pfeseWd05 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-35sIsM0pfeseWd05 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-35sIsM0pfeseWd05 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-35sIsM0pfeseWd05 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-35sIsM0pfeseWd05 .cluster text{fill:#333;}#mermaid-svg-35sIsM0pfeseWd05 .cluster span{color:#333;}#mermaid-svg-35sIsM0pfeseWd05 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-35sIsM0pfeseWd05 :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 返回数据源Key 应用层 AbstractRoutingDataSource determineCurrentLookupKey 目标数据源 获取物理连接 执行SQL 关键特性 数据源路由抽象通过 determineCurrentLookupKey() 动态决定数据源AOP 集成通常结合 DataSource 注解和切面实现自动切换简单配置通过 Map 维护多个数据源Bean public DataSource dataSource() {MapObject, Object targetDataSources new HashMap();targetDataSources.put(ds1, ds1());targetDataSources.put(ds2, ds2());AbstractRoutingDataSource routingDataSource new AbstractRoutingDataSource() {Overrideprotected Object determineCurrentLookupKey() {return DataSourceContextHolder.get();}};routingDataSource.setTargetDataSources(targetDataSources);return routingDataSource; }三、核心功能对比 功能ShardingSphereSpring动态数据源分库分表✅ 支持复杂分片策略哈希、范围等❌ 仅支持简单数据源切换SQL改写✅ 自动改写逻辑表名为物理表名❌ 不支持读写分离✅ 内置负载均衡策略❌ 需自行实现分布式事务✅ 支持 XA/SAGA 等模式❌ 依赖 Spring 事务管理器跨库查询✅ 自动合并多数据源结果❌ 需手动处理性能优化✅ 并行执行、连接池复用❌ 简单连接切换 四、技术实现差异 1. 路由触发机制 ShardingSphere // 通过 SQL 解析触发路由 String sql SELECT * FROM user WHERE user_id 123; ShardingRouter.route(sql); // 自动解析 user_id123 → ds_1.user_003Spring动态数据源 // 需手动设置路由标识 DataSourceContextHolder.set(ds2); jdbcTemplate.query(...); // 使用 ds2 执行 DataSourceContextHolder.clear();2. 事务管理 ShardingSphere // 分布式事务管理 ShardingTransactionType(TransactionType.XA) Transactional public void crossDatabaseUpdate() {// 跨库操作... }Spring动态数据源 Transactional public void multiDataSourceOp() {// 需保证所有操作在同一数据源// 跨数据源操作会破坏事务一致性 }五、选型建议 1. 使用 ShardingSphere 的场景 单表数据量超过 500 万行需要自动化的分库分表、读写分离涉及跨分片查询和事务要求透明的 SQL 兼容性 2. 使用 Spring 动态数据源的场景 多租户数据隔离每个租户独立数据库开发/测试环境动态切换数据源简单的读写分离主从架构轻量级多数据源需求数据源数量 5 六、混合架构示例 可将两者结合使用实现多层数据路由 #mermaid-svg-tx75s5aGDk3vnk4O {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tx75s5aGDk3vnk4O .error-icon{fill:#552222;}#mermaid-svg-tx75s5aGDk3vnk4O .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tx75s5aGDk3vnk4O .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-tx75s5aGDk3vnk4O .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tx75s5aGDk3vnk4O .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tx75s5aGDk3vnk4O .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tx75s5aGDk3vnk4O .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tx75s5aGDk3vnk4O .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tx75s5aGDk3vnk4O .marker.cross{stroke:#333333;}#mermaid-svg-tx75s5aGDk3vnk4O svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tx75s5aGDk3vnk4O .label{font-family:"trebuchet ms",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tx75s5aGDk3vnk4O .cluster-label text{fill:#333;}#mermaid-svg-tx75s5aGDk3vnk4O .cluster-label span{color:#333;}#mermaid-svg-tx75s5aGDk3vnk4O .label text,#mermaid-svg-tx75s5aGDk3vnk4O span{fill:#333;color:#333;}#mermaid-svg-tx75s5aGDk3vnk4O .node rect,#mermaid-svg-tx75s5aGDk3vnk4O .node circle,#mermaid-svg-tx75s5aGDk3vnk4O .node ellipse,#mermaid-svg-tx75s5aGDk3vnk4O .node polygon,#mermaid-svg-tx75s5aGDk3vnk4O .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tx75s5aGDk3vnk4O .node .label{text-align:center;}#mermaid-svg-tx75s5aGDk3vnk4O .node.clickable{cursor:pointer;}#mermaid-svg-tx75s5aGDk3vnk4O .arrowheadPath{fill:#333333;}#mermaid-svg-tx75s5aGDk3vnk4O .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tx75s5aGDk3vnk4O .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tx75s5aGDk3vnk4O .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-tx75s5aGDk3vnk4O .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-tx75s5aGDk3vnk4O .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tx75s5aGDk3vnk4O .cluster text{fill:#333;}#mermaid-svg-tx75s5aGDk3vnk4O .cluster span{color:#333;}#mermaid-svg-tx75s5aGDk3vnk4O div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tx75s5aGDk3vnk4O :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;} 租户A 租户B 应用层 Spring动态数据源 租户ID路由 ShardingSphere集群A ShardingSphere集群B 分库分表数据源组 分库分表数据源组 配置示例 // 第一层Spring动态数据源租户路由 public class TenantRoutingDataSource extends AbstractRoutingDataSource {Overrideprotected Object determineCurrentLookupKey() {return TenantContext.getCurrentTenant();} }// 第二层ShardingSphere数据源分库分表 Bean public DataSource shardingDataSourceA() {// 配置分片规则...return ShardingSphereDataSourceFactory.createDataSource(...); }七、性能对比 指标ShardingSphereSpring动态数据源简单查询延迟10~15ms含解析路由2~5ms直接路由跨分片查询吞吐量5000 TPS并行执行不支持跨数据源查询连接池管理分片级独立连接池全局统一连接池高并发场景优异步执行连接复用良依赖连接池配置 总结 ShardingSphere 是面向分布式数据库的“重型武器”适合复杂分片场景但需要付出一定的学习成本。Spring动态数据源 是轻量级工具适合简单多数据源需求但功能有限。两者可结合使用用 Spring 做租户级路由ShardingSphere 处理分库分表形成多层数据路由架构。
http://www.tj-hxxt.cn/news/227538.html

相关文章:

  • 网站插件模块原理c2c电子商务网站开发
  • 广告网站模板下载不了国外建设网站情况
  • 温州网站排名优化怎样自己动手做微官网站
  • 官方网站下载穿越火线网站建设资讯
  • 中原彼得堡航空学院网站的建设怎么样建设一个网站
  • 网站开发会员功能教程开发网页多少钱
  • 武陟县住房和城乡建设局网站网站页面设计收费
  • 手机app开发网站模板下载襄阳网站建设知名品牌
  • 北京网站制作网络推广公司网站怎么做双机房切换
  • wordpress本地 域名兰州官网优化服务
  • 上海网站推广哪家好wordpress分栏插件
  • 深圳做网站推广公司中国哪家网站做仿古做的好
  • 网站开发模块就业前景呼和浩特网站seo优化方案
  • 网站建设公司架构网站备案 多ip
  • 做展示型网站多少钱开发app学什么编程语言
  • 网站流量怎么查看网站建设与运行
  • 如何建设下载网站注册网址免费
  • 网络推广平台排行前十名昆明seo关键词
  • 小型项目外包网站网站建设多少钱一年
  • 校友网站建设方案wordpress 自动翻译
  • html5 手机网站 教程外贸建站网站建设
  • 专业网站设计制作个人帮忙做网站吗
  • 阿里网站seo网站图片居中代码
  • 中国建设银行网站的社保板块在哪里客户管理系统哪找
  • 江苏省工程建设协会网站小型营销企业网站建设策划
  • 网站集群建设pptwordpress软件推荐
  • 企业免费自助建站平台照片做成视频的软件
  • 自媒体网站源码模板dedewordpress动
  • 网站建网站建设seo帮帮您惠州百度seo找谁
  • 网站建设预算策划网站开发收税