Sharding-JDBC Demo含源码

Sharding-JDBC快速入门demo 一.需求描述 使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用 方法; 通过Sharding-Jdbc向订单表插入数据, 按照一定的分片规则,主键为偶数的进入t_order_1,另一部分数据进入t_order_2,通过Sharding-Jdbc 查询数据,根据 SQL语句的内容从t_order_1或t_order_2查询数据。 二.环境搭建 1.sql CREATE DATABASE `order_db` CHARACTER SET 'u 阅读详情

        花了两天时间学习了分库分表Sharding-JDBC,在bilibili看了教学视频,源码主要是博客https://blog.youkuaiyun.com/yangxiang_Younger/article/details/113122070#commentBox的,博客内存在bug,主要是注解“@Primary”的问题,@Primary注解在ds0上则使用的是原生的dataSource,此时使用JPA不可分库分表,排查了一段时间“@Primary”需注解在 shardingDataSource。修改后亲测可用。针对多数据源情况,需要在工程SpringBootApplication注解中排除自动配置类,如下

@SpringBootApplication(exclude={
        DataSourceAutoConfiguration.class,
//        HibernateJpaAutoConfiguration.class, //(如果使用Hibernate时,需要加)
        DataSourceTransactionManagerAutoConfiguration.class,
})
public class DemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(DemoApplication.class, args);
    }

}

此Demo使用pom.xml配置如下

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.0.6.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.funtest</groupId>
    <artifactId>demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.21</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>


        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>8.0.17</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/org.apache.shardingsphere/sharding-jdbc-core -->
        <dependency>
            <groupId>org.apache.shardingsphere</groupId>
            <artifactId>sharding-jdbc-core</artifactId>
            <version>4.0.1</version>
        </dependency>
    </dependencies>

代码正确的配置如下:

package com.funtest.shard.database.policy;

import com.alibaba.druid.pool.DruidDataSource;
import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.api.config.sharding.ShardingRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.TableRuleConfiguration;
import org.apache.shardingsphere.api.config.sharding.strategy.StandardShardingStrategyConfiguration;
import org.apache.shardingsphere.shardingjdbc.api.ShardingDataSourceFactory;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Primary;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.sql.SQLException;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @Author: flathead
 * @Date: 2021/4/30 17:20
 */
@Component
@Slf4j
public class CustomerDataSourceFactory {

    @Value("${shard.jdbc.ds0.url}")
    private String dsOUrl;
    @Value("${shard.jdbc.ds1.url}")
    private String ds1Url;

    @Value("${mysql.username}")
    private String mysqlUserName;

    @Value("${mysql.password}")
    private String mysqlPassword;

    @Value("${mysql.driver.class}")
    private String driverClassName;

    @Value("${spring.jpa.hibernate.ddl-auto}")
    private String ddlDef;


    /**
     * 设置数据源ds0
     */
    @Bean(name = "ds0", initMethod = "init", destroyMethod = "close")
    public DruidDataSource getDs0Source() throws SQLException {
        DruidDataSource dataSource0 = new DruidDataSource();
        dataSource0.setDriverClassName(driverClassName);
        dataSource0.setUrl(dsOUrl);
        dataSource0.setUsername(mysqlUserName);
        dataSource0.setPassword(mysqlPassword);
        dataSource0.setInitialSize(5);
        dataSource0.setMaxActive(20);
        dataSource0.setMinIdle(10);
        dataSource0.setMaxWait(30000);
        dataSource0.setFilters("stat,wall");
        Properties properties = new Properties();
        properties.setProperty("connectTimeout", "2000");
        properties.setProperty("socketTimeout", "600000");
        properties.setProperty("spring.jpa.hibernate.ddl-auto", ddlDef);
        dataSource0.setConnectProperties(properties);
        return dataSource0;
    }

    /**
     * 设置数据源ds1
     */
    @Bean(name = "ds1", initMethod = "init", destroyMethod = "close")
    public DruidDataSource getDs1Source() throws SQLException {
        DruidDataSource dataSource1 = new DruidDataSource();
        dataSource1.setDriverClassName(driverClassName);
        dataSource1.setUrl(ds1Url);
        dataSource1.setUsername(mysqlUserName);
        dataSource1.setPassword(mysqlPassword);
        dataSource1.setInitialSize(5);
        dataSource1.setMaxActive(20);
        dataSource1.setMinIdle(10);
        dataSource1.setMaxWait(30000);
        dataSource1.setFilters("stat,wall");
        Properties properties = new Properties();
        properties.setProperty("connectTimeout", "2000");
        properties.setProperty("socketTimeout", "600000");
        properties.setProperty("spring.jpa.hibernate.ddl-auto", ddlDef);
        dataSource1.setConnectProperties(properties);
        return dataSource1;
    }

    /**
     * 分片逻辑名称前缀 shard 分表
     */
    @Primary
    @Bean(name = "shardingDataSource")
    public DataSource shardingDataSource(@Qualifier("ds0") DruidDataSource ds0, @Qualifier("ds1") DruidDataSource ds1) {
        // 获取数据源对象
        Properties properties = new Properties();
        properties.setProperty("max.connections.size.per.query", "10");
//        if (devMode.equals("dao-dev")) {
//            // dev  环境开启此参数
//            properties.setProperty("sql.show", "true");
//        }
        DataSource dataSource = null;
        try {
            Map<String, DataSource> targetDataSource = new HashMap<>();
            targetDataSource.put("ds0", ds0);
            targetDataSource.put("ds1", ds1);
            //设置分表规则,订单后两位,路由至0-1,2张表
            ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration();
            //必须设置默认数据源
            shardingRuleConfig.setDefaultDataSourceName("ds0");
            shardingRuleConfig.getTableRuleConfigs().add(orderRuleConfig());
            //shardingRuleConfig.getTableRuleConfigs().add(orderItemRuleConfig());
            //设置分库规则,订单/2,偶數ds0,奇數ds1
            shardingRuleConfig.setDefaultDatabaseShardingStrategyConfig(new StandardShardingStrategyConfiguration("order_id", ShardingDBAlgorithm.DATABASE_SHARDING_ALGORITHM));
            //绑定表
            //shardingRuleConfig.getBindingTableGroups().add("t_order, t_order_item");
            shardingRuleConfig.getBindingTableGroups().add("t_order");
            //创建sharding数据源
            dataSource = ShardingDataSourceFactory.createDataSource(targetDataSource, shardingRuleConfig, properties);
        } catch (SQLException e) {
            e.printStackTrace();
            log.error("MYSQL shardconfig 数据源初始化失败");
        }
        log.info("MYSQL shardconfig 数据源初始化成功");
        return dataSource;
    }

    /**
     * 设置订单表分表规则
     */
    private TableRuleConfiguration orderRuleConfig() {
        TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration("t_order", "ds${0..1}.t_order_${0..1}");
        StandardShardingStrategyConfiguration tableRule = new StandardShardingStrategyConfiguration("order_id", new OrderCheckShardingTableAlgorithm());
        tableRuleConfig.setTableShardingStrategyConfig(tableRule);
        return tableRuleConfig;
    }

    /**
     * 设置订单商品表分表规则(该规则未使用)
     */
    private TableRuleConfiguration orderItemRuleConfig() {
        TableRuleConfiguration tableRuleConfig = new TableRuleConfiguration("t_order_item", "ds0.t_order_item_${0..1}");
        StandardShardingStrategyConfiguration tableRule = new StandardShardingStrategyConfiguration("order_id", new OrderCheckShardingTableAlgorithm());
        tableRuleConfig.setTableShardingStrategyConfig(tableRule);
        return tableRuleConfig;
    }



}

分库规则

package com.funtest.shard.database.policy;

import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;

/**
 * @Author: flathead
 * @Date: 2021/5/3 11:01
 */
@Slf4j
public class ShardingDBAlgorithm {
    public static final DatabaseShardingAlgorithm DATABASE_SHARDING_ALGORITHM = new DatabaseShardingAlgorithm();
    /**
     * 分库规则
     */
    static class DatabaseShardingAlgorithm implements PreciseShardingAlgorithm<Long> {
        @Override
        public String doSharding(Collection<String> databaseNames, PreciseShardingValue<Long> shardingValue) {
            Long orderId = shardingValue.getValue();
            long index = orderId % 2;
            String dataSource = "ds"+index;
//            dataSource="ds0";
            log.info("数据库:{}",dataSource);
            return dataSource;
        }
    }

}

分表规则

package com.funtest.shard.database.policy;

import lombok.extern.slf4j.Slf4j;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingAlgorithm;
import org.apache.shardingsphere.api.sharding.standard.PreciseShardingValue;

import java.util.Collection;

/**
 * @Author: flathead
 * @Date: 2021/5/3 10:52
 */
@Slf4j
public class OrderCheckShardingTableAlgorithm implements PreciseShardingAlgorithm<Long> {
    @Override
    public String doSharding(Collection<String> tableNames, PreciseShardingValue<Long> shardingValue) {
        StringBuilder buf = new StringBuilder();
        Long orderId = shardingValue.getValue();
        String orderIdStr = orderId.toString();
//        String orderIdSuffix = orderIdStr.substring(orderIdStr.length() - 2);
//        String logicTableName = shardingValue.getLogicTableName();
//        buf.append(logicTableName).append("_").append(orderIdSuffix);
//        if(tableNames.contains(buf.toString())) {
//            return buf.toString();
//        } else {
//            String errMsg = String.format("取模精确分片策略:没找到与分片键匹配的表名! %s : %s = %s", shardingValue.getLogicTableName(), shardingValue.getColumnName(), shardingValue.getValue());
//            log.info(errMsg);
//            throw new UnsupportedOperationException(errMsg);
//        }
//        if(tableNames.contains(orderId%2)) {
//            return buf.toString();
//        } else {
//            String errMsg = String.format("取模精确分片策略:没找到与分片键匹配的表名! %s : %s = %s", shardingValue.getLogicTableName(), shardingValue.getColumnName(), shardingValue.getValue());
//            log.info(errMsg);
//            throw new UnsupportedOperationException(errMsg);
//        }
        for (String tableName:tableNames){
            if (tableName.endsWith(String.valueOf(orderId%2))){
                return tableName;
            }
        }
        throw new UnsupportedOperationException("xxxx");
    }

}

代码放在了  https://gitee.com/flathead/sharding-jdbc-demo.git (git clone 可直接下载)

数据库需要手动创建(看下源码不难的)

23. sharding-jdbc源码之orchestration简介&使用 阿飞Javaer,转载请注明原创出处,谢谢! sharding-jdbc2.x核心功能之一就是orchestration,即编排治理,什么意思呢?官方文档介绍–2.0.0.M1版本开始,sharding-jdbc提供了数据库治理功能,主要包括: - 配置集中化与动态化。可支持数据源、表与分片及读写分离策略的动态切换; - 数据治理。提供熔断数据库访问程序对数据库的访问和禁用从库的访问... 阅读详情

相关推荐

shardingJdbc 小demo 源码下载

Apache ShardingSphere 是一套开源的分布式数据库解决方案组成的生态圈。 组成部分: JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独立部署,又支持混合部署配合使用的产品组成。 功能特性:它们均提供标准化的数据水平扩展、分布式事务和分布式治理等功能,可适用于如 Java 同构、异构语言、云原生等各种多样化的应用场景。

Sharding-jdbc 概念及Demo(4.0.0-RC1版本Demo)

shardingjdbc 分库分表 读写分离Demo和概念

Persistence___的博客 1040

ShardingJDBC5.1.1按月分库分表、读写分离、自动创表完整demo

SpringBoot、Mybaits-Plus、Druid

2022年Sharding-JDBC源码学习(一):梳理流程以及分析如何扩展服务

前言 怎样在Java的JDBC层提供额外的服务,源码是怎样实现的? 本篇文章首先梳理整个注册以及执行流程,发现Sharding-JDBC按照如下步骤提供服务 2.1 Sharding-JDBC根据配置生成数据源ShardingSphereDataSource 2.2 根据数据源获取连接ShardingSphereConnection 2.3 通过连接将sql封装成ShardingSpherePreparedStatement 2.4 委托ShardingSpherePreparedStatement执行u

snail-jie的博客 1225

springboot整合sharding-jdbc完整代码

springboot整合sharding-jdbc完整代码,基本上涵盖了sharding-jdbc所有技术点,代码只需要简单修改下配置即可运行起来

sharding jdbc 基于java代码的配置.zip

sharding jdbc 基于java代码的配置

Sharding-JDBC 源码之启动流程分析

Sharding-JDBC 是 ShardingSphere 开源的分布式数据库中间件产品之一,提供标准化的数据分片、分布式事务和数据库治理功能,可适用于如Java同构、异构语言、云原生等各种多样化的应用场景。 Sharding-JDBC 在 Java 的 JDBC 层提供额外服务,它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架 接下来,让我们由简入繁,逐渐拉来 Sharding-JDBC 的序幕。 首先基于 Sprin.

朝花夕拾 2252

ms17-010 永恒之蓝漏洞利用+抓包分析过程

一、实验环境: 1、攻击机:Kali 1)攻击工具:msf 2)分析工具:wireshark 3)IP地址:192.168.204.157(自动获得) 2、靶 机:Windows7 1)版本:SP1 2)开启网络共享(SMB协议) 3)关闭防火墙 4)IP地址:192.168.204.150(自动获得) 3、网卡连接方式:Vmnet8(NAT) 二、实验步骤: ...

qq_41976183的博客 6947

【MySQL 读写分离】Sharding JDBC + Spring boot 实现数据库读写分离的登录 Demo

Sharding JDBC + Spring boot 实现数据库读写分离的登录 Demo

liuwanqing233333的博客 1360

CentOS 7.9安装python3.11

CentOS 7.9安装python3.11

leafseelight的专栏 1342

反激开关电源变压器设计实战:从理论到绕制的完整流程解析

本文详细解析了反激开关电源变压器的完整设计流程,从核心理论到实战绕制。文章以24W电源为例,手把手讲解如何根据输入输出电压、功率和频率等关键参数,计算匝比、峰值电流、电感量,并完成磁芯选择、匝数确定、气隙计算及线径选取。重点阐述了CCM模式下的设计要点与绕制工艺,旨在帮助工程师设计出稳定高效的反激变压器,避免常见陷阱。

weixin_29305313的博客 684

sharding-jdbc读写分离

分析源码前,先阅读一遍官方文档读写分离;主要记录学习一下,公众号:帽爹的技术轮子 核心概念 主库:添加、更新以及删除数据操作 从库:查询数据操作所使用的数据库,可支持多从库 一主多从读写分离,多主多从需用使用sharding 源码分析 1.启动入口: public ...

914

Linux内核模块开发实战指南(2025版)

2025年Linux内核模块开发迎来革命性突破!本文将从零开始手把手教你构建可动态加载的AI加速驱动模块,揭秘最新内核特性与开发技巧,更包含独家性能调优方案与跨架构移植秘籍。文末附赠价值百万的调试脚本,助你轻松突破开发瓶颈!

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 1808

Sharding-JDBC——数据分片——分表(最全demo)

标准分片策略适用于单分片键,此策略支持和两个分片算法。其中是必选的,用于处理和IN的分片。是可选的,用于处理BETWEEN==、AND>=

cxclll的博客 1012

ENVI哨兵一号数据处理

使用ENVI+SarScape处理哨兵数据

Rjjjjj11的博客 2万+

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

基于图神经网络强化学习解决车辆路径规划问题(完整代码+报告)

3055

springBoot+sharding-jdbc+mybatis整合demo

Demo实现的功能 使用sharding-jdbc实现水平分库分表,从数据库添加和查询数据功能。 github源码地址 https://github.com/mikewuhao/springBoot-schedule-demo 搭建详细步骤 准备工作 建立好2个数据库: boot1和boot2, 每个库建2张相同结构的表: 命名user1和user2, 如下所示 : user表的建表语句 /* Navicat MySQL Data Transfer Source Server : loc

mikewuhao的博客 1582

【树莓派安装Homeassistant及基本配置】

时隔一年,我又重新开始玩Homeassistant,发现其中奥妙无穷,惊喜不断。在我浅薄的认知中要学好嵌入式,必须玩过Homeassistant,并且玩出自己的名堂!因为这是最贴切实际的生活应用没有之一,每月更新使得唯有活水来;拥抱大千使得永葆青春的活力;鬼斧神工的操作精彩纷呈,可以堪称软件与硬件的完美落地!

vor234的博客 1万+

数据库中间件 Sharding-JDBC 和 MyCAT 源码解析合集

Sharding-JDBC 目录如下:Sharding-JDBC 源码分析 —— SQL 解析(一)之词法解析Sharding-JDBC 源码分析 —— SQL 解析(二...

芋道源码 1073

PDBfixer: PDB修补蛋白残基

PDBFixer是一款专门用于修复蛋白质数据库(PDB)文件常见问题的工具。它能自动处理X射线晶体学结构中常见的缺陷,包括缺失氢原子、不完整侧链、非标准残基等问题。该工具提供三种使用方式:图形界面、命令行和Python API,支持添加缺失原子(全部/重原子/氢原子)、替换非标准残基、补全缺失残基等功能。特别适用于分子动力学模拟前的预处理,可自动添加水盒子并调整离子浓度。用户可通过简单命令或自定义脚本实现复杂修复流程,内置非标准残基替换表确保结构标准化。

Protein Designer的博客 933

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Sharding-JDBC(四)集成dynamic-datasource

实现原理: * 通过 DataSourceConfig.java 将ShardingJDBC数据源配置为动态数据源之一。 * 通过 @DS(DataSourceConfig.SHARDING_DATA_SOURCE_NAME) 使用 ShardingJDBC 的数据源进行分表操作。

ACGkaka的博客 6720

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Sharding-jdbc

jdbc真是个大坑,如果不是必要进行分库分表的话,就不要使用 sharding-jdbc,因为会有诸多的限制和不方便 版本:2.0.0.M3 注意:本篇主要针对spring-mybatis不分库只分表 目前Sharding-JDBC还在不断更新中,网上很多资料和答疑都是以前出现但是已修复了的,包括本篇,因此学习资料和问题解答最好是围绕着官方走。推荐加入官方群(在官网里找,提问的人多,答复的人少),...

java开发郭靖 792

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

springboot整合sharding-jdbc连接oracle实现单库分表

springboot整合sharding-jdbc连接oracle实现单库分表 在业务处理中很经常会有大数据的保存,涉及到分表操作,水平分表。 涉及到的版本 oracle 11 springboot 2.1.6 sharding-jdbc 3.0.0.M1 在本文章中只介绍简单的一种 文章目录springboot整合sharding-jdbc连接oracle实现单库分表1 介绍sharding-j...

我吃包菜 8961

sharding-jdbc分库分表

本文只是快速入门,附带源码,其中已包含sql。

Amrdt的博客 566

shardingsphere sharding-jdbc配置和使用教程

sharding-jdbc使用教程概念分库分表Sharding-JDBC逻辑表真实表数据节点环境要求Sharding-JDBC配置行表达式代码项目依赖配置数据库初始化源码片段代码结构代码清单测试类运行结果 概念 分库分表 分库:从单个数据库拆分成多个数据库的过程,将数据散落在多个数据库中。 分表:从单张表拆分成多张表的过程,将数据散落在多张表内。 本文主要针对水平拆分。 Sharding-JDBC Sharding-JDBC是一套开源的分布式数据库中间件解决方案,定位为轻量级Java框架,在Java的JD

qq_36845528的博客 7853
上一篇: Linux下Java使用RXTX串口读写
ren-share
博客等级 码龄12年 3粉丝 3原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值