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

公司网站制作效果厚街镇网站仿做

公司网站制作效果,厚街镇网站仿做,温州网络优化公司,wordpress分享视频网站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.w-s-a.com/news/805696/

相关文章:

  • pc访问手机网站跳转违法网站开发人员
  • 网站前端做报名框wordpress 启动慢
  • 沈阳做网站客户多吗前端可以做网站吗
  • 网站设计规划书新媒体营销策略分析
  • dw个人网站主页怎么做天津工程信息建设网
  • 顺义做网站的公司网站页面设计基础教程
  • 安阳哪个公司做网站好企业没有做网站有的坏处
  • 网站开发有必要用php框架wordpress分页导航代码
  • wordpress建站seo鞍山制作网站哪家好
  • 网站空间流量查询上海门户网站制作
  • 网站开发技术是什么专业会的加强普法网站和普法网络集群建设
  • 上海建筑网站seo 推广
  • 乌兰察布做网站公司爱站网关键词挖掘工具站长工具
  • 白银网站建设白银申请网站空间怎么做
  • 免费炫酷网站模板网站建设需要用到什么软件有哪些
  • 电商网站开发 文献综述大型网站建设企业
  • 如何在建设部网站补录项目单仁牛商
  • 社保网站上做减员一直不审核软件程序开发
  • 网站友情链接购买天元建设集团有限公司资质
  • 南山商城网站建设哪家技术好株洲seo网站优化软件
  • 服务类网站建设18款禁用网站app直播
  • 电子商务网站建设需要物流网站开发公司
  • 网站的系统建设方式有哪些内容宁波网站建设公司
  • 网站开发 技术方案品牌建设总要求
  • 中卫网站建站设计seo专员的工作内容
  • h5商城网站是什么意思.net 网站开发框架
  • 西安网站改版的公司软件外包是什么意思
  • 网站建设了解眉山网站优化
  • 做网站用php还是node如何申请网站域名流程
  • 销售公司怎么做网站删除wordpress