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

灰色网站模板游戏介绍网站模板

灰色网站模板,游戏介绍网站模板,北京产品网站建设,网站使用授权书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.hkea.cn/news/14537673/

相关文章:

  • 手机网站个人中心源码广州网站订制开发
  • 博览局网站建设深圳大浪有做网站的吗
  • 无障碍环境建设 网站做包装找灵感看什么网站
  • 做阿里网站的分录手机端网站建设教程
  • 导购网站开发要多少钱淮安网站建设工作室
  • 广州 门户seo优秀网站
  • 茶叶网站源码深圳品牌馆设计公司
  • 做一手楼房的网站营销型网站建设营销型网站建设
  • 网站优化提升速度网站建设:中企动力
  • 弹簧东莞网站建设网络推广运营
  • 南昌市建设规费标准网站无极限网站模板
  • 南京高端定制网站建设win怎么卸载wordpress
  • 那个网站做教学视频定做网站多少钱
  • 如何做付费阅读网站做网站费用多少钱
  • 怎么优化网站关键词网站建设书怎么写
  • 建材企业网站模板镇江网站建设教程
  • 免费推广网站注册入口wordpress sinaapp
  • 本地网站建设教程dw做网站链接数据库
  • 哪一个网站可以做任务拿佣金广安建设机械网站
  • 淘宝店铺网站建立哪个网站可以做彩经专家
  • 做一个招聘信息的网站_用什么做网站的软件wordpress怎么设置seo
  • wordpress进入站点拟定网络设计方案
  • 承德网站制作多少钱销售易app官网下载
  • 学做标书网站如何制作营销网站
  • 婚恋网站的架构网站模板如何优化
  • 百度站长对网站会有影响吗临沭有做网站的吗
  • flash下载网站长沙租车网站排名
  • 阿里云做的海外网站怎么样官方网站建设滞后
  • 公司网站建设需要的材料网站建设求职要求
  • 宁夏政务网站建设标准百度搜索不到公司网站