iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >如何使用Sharding-JDBC对数据进行分片处理
  • 670
分享到

如何使用Sharding-JDBC对数据进行分片处理

2023-06-25 11:06:47 670人浏览 独家记忆
摘要

如何使用Sharding-JDBC对数据进行分片处理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言Sharding-JDBC是ShardingSphere的

如何使用Sharding-JDBC对数据进行分片处理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。

前言

Sharding-JDBC是ShardingSphere的第一个产品,也是ShardingSphere的前身。

它定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。

  • 适用于任何基于Java的ORM框架,如:JPA, Hibernate, mybatis, spring JDBC Template或直接使用JDBC。

  • 基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等支持任意实现JDBC规范的数据库。

  • 目前支持MySQLoraclesqlServer和postgresql

Sharding-JDBC的使用需要我们对项目进行一些调整:结构如下

ShardingSphere文档地址

如何使用Sharding-JDBC对数据进行分片处理

这里使用的是SpringBoot项目改造

一、加入依赖

<!-- 这里使用了druid连接池 --><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid</artifactId>    <version>1.1.9</version></dependency><!-- sharding-jdbc 包 --><dependency>    <groupId>com.dangdang</groupId>    <artifactId>sharding-jdbc-core</artifactId>    <version>1.5.4</version></dependency><!-- 这里使用了雪花算法生成组建,这个算法的实现的自己写的代码,各位客关老爷可以修改为自己的id生成策略 --><dependency>    <groupId>org.kcsm.common</groupId>    <artifactId>kcsm-idgenerator</artifactId>    <version>3.0.1</version></dependency>

二、修改application.yml配置文件

#启动接口server:  port: 30009spring:  jpa:    database: Mysql    show-sql: true    hibernate:#      修改不自动更新表      ddl-auto: none#数据源0定义,这里只是用了一个数据源,各位客官可以根据自己的需求定义多个数据源database0:  databaseName: database0  url: jdbc:mysql://kcsm-pre.mysql.rds.aliyuncs.com:3306/dstest?characterEncoding=utf8&useUnicode=true&useSSL=false&serverTimezone=Hongkong  username: root  passWord: kcsm@111  driverClassName: com.mysql.jdbc.Driver

三、数据源定义

package com.lzx.code.codedemo.config;import com.alibaba.druid.pool.DruidDataSource;import lombok.Data;import org.springframework.boot.context.properties.ConfigurationProperties;import org.springframework.stereotype.Component;import javax.sql.DataSource;@Data@ConfigurationProperties(prefix = "database0")@Componentpublic class Database0Config {    private String url;    private String username;    private String password;    private String driverClassName;    private String databaseName;    public DataSource createDataSource() {        DruidDataSource result = new DruidDataSource();        result.setDriverClassName(getDriverClassName());        result.setUrl(getUrl());        result.setUsername(getUsername());        result.setPassword(getPassword());        return result;    }}

四、数据源分配算法实现

package com.lzx.code.codedemo.config;import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlGorithm;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Component;import java.util.ArrayList;import java.util.Collection;import java.util.List;@Componentpublic class DatabaseShardingAlgorithm implements SingleKeyDatabaseShardingAlgorithm {    @Autowired    private Database0Config database0Config;        @Override    public String doEqualSharding(Collection collection, ShardingValue shardingValue) {        return database0Config.getDatabaseName();    }        @Override    public Collection<String> doInSharding(Collection collection, ShardingValue shardingValue) {        List<String> result = new ArrayList<String>();        result.add(database0Config.getDatabaseName());        return result;    }        @Override    public Collection<String> doBetweenSharding(Collection collection, ShardingValue shardingValue) {        List<String> result = new ArrayList<String>();        result.add(database0Config.getDatabaseName());        return result;    }}

五、数据表分配算法

package com.lzx.code.codedemo.config;import com.dangdang.ddframe.rdb.sharding.api.ShardingValue;import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm;import com.google.common.collect.Range;import org.springframework.stereotype.Component;import java.util.Collection;import java.util.LinkedHashSet;@Componentpublic class TableShardingAlgorithm implements SingleKeyTableShardingAlgorithm<Long> {        @Override    public String doEqualSharding(Collection<String> collection, ShardingValue<Long> shardingValue) {        for (String eaach:collection) {            Long value = shardingValue.getValue();            value = value >> 22;            if(eaach.endsWith(value%10+"")){                return eaach;            }        }        throw new IllegalArgumentException();    }        @Override    public Collection<String> doInSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {        Collection<String> result = new LinkedHashSet<>(tableNames.size());        for (Long value : shardingValue.getValues()) {            for (String tableName : tableNames) {                value = value >> 22;                if (tableName.endsWith(value % 10 + "")) {                    result.add(tableName);                }            }        }        return result;    }        @Override    public Collection<String> doBetweenSharding(Collection<String> tableNames, ShardingValue<Long> shardingValue) {        Collection<String> result = new LinkedHashSet<>(tableNames.size());        Range<Long> range = shardingValue.getValueRange();        for (Long i = range.lowerEndpoint(); i <= range.upperEndpoint(); i++) {            for (String each : tableNames) {                Long value = i >> 22;                if (each.endsWith(i % 10 + "")) {                    result.add(each);                }            }        }        return result;    }}

六、数据源配置

package com.lzx.code.codedemo.config;import com.dangdang.ddframe.rdb.sharding.api.ShardingDataSourceFactory;import com.dangdang.ddframe.rdb.sharding.api.rule.DataSourceRule;import com.dangdang.ddframe.rdb.sharding.api.rule.ShardingRule;import com.dangdang.ddframe.rdb.sharding.api.rule.TableRule;import com.dangdang.ddframe.rdb.sharding.api.strategy.database.DatabaseShardingStrategy;import com.dangdang.ddframe.rdb.sharding.api.strategy.table.TableShardingStrategy;import com.dangdang.ddframe.rdb.sharding.keygen.DefaulTKEyGenerator;import com.dangdang.ddframe.rdb.sharding.keygen.KeyGenerator;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;import java.sql.SQLException;import java.util.Arrays;import java.util.HashMap;import java.util.Map;@Configurationpublic class DataSourceConfig {    @Autowired    private Database0Config database0Config;    @Autowired    private DatabaseShardingAlgorithm databaseShardingAlgorithm;    @Autowired    private TableShardingAlgorithm tableShardingAlgorithm;    @Bean    public DataSource getDataSource() throws SQLException {        return buildDataSource();    }    private DataSource buildDataSource() throws SQLException {        //分库设置        Map<String, DataSource> dataSourceMap = new HashMap<>(2);        //添加两个数据库database0和database1        dataSourceMap.put(database0Config.getDatabaseName(), database0Config.createDataSource());        //设置默认数据库        DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap, database0Config.getDatabaseName());        //分表设置,大致思想就是将查询虚拟表Goods根据一定规则映射到真实表中去        TableRule orderTableRule = TableRule.builder("user")                .actualTables(Arrays.asList("user_0", "user_1", "user_2", "user_3", "user_4", "user_5", "user_6", "user_7", "user_8", "user_9"))                .dataSourceRule(dataSourceRule)                .build();        //分库分表策略        ShardingRule shardingRule = ShardingRule.builder()                .dataSourceRule(dataSourceRule)                .tableRules(Arrays.asList(orderTableRule))                .databaseShardingStrategy(new DatabaseShardingStrategy("ID", databaseShardingAlgorithm))                .tableShardingStrategy(new TableShardingStrategy("ID", tableShardingAlgorithm)).build();        DataSource dataSource = ShardingDataSourceFactory.createDataSource(shardingRule);        return dataSource;    }    @Bean    public KeyGenerator keyGenerator() {        return new DefaultKeyGenerator();    }}

七、开始测试

定义一个实体

package com.lzx.code.codedemo.entity;import com.fasterxml.jackson.annotation.JSONIgnoreProperties;import com.fasterxml.jackson.databind.annotation.jsonSerialize;import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;import lombok.*;import org.hibernate.annotations.GenericGenerator;import javax.persistence.*;@Entity(name = "USER")@Getter@Setter@ToString@JsonIgnoreProperties(ignoreUnknown = true)@AllArgsConstructor@NoArgsConstructorpublic class User {        @Id    @GeneratedValue(generator = "idUserConfig")    @GenericGenerator(name ="idUserConfig" ,strategy="org.kcsm.common.ids.SerialIdGeneratorSnowflakeId")    @Column(name = "ID", unique = true,nullable=false)    @JsonSerialize(using = ToStringSerializer.class)    private Long id;        @Column(name = "USER_NAME",length = 100)    private String userName;        @Column(name = "PASSWORD",length = 100)    private String password;}

定义实体DAO

package com.lzx.code.codedemo.dao;import com.lzx.code.codedemo.entity.User;import org.springframework.data.jpa.repository.JpaRepository;import org.springframework.data.jpa.repository.JpaSpecificationExecutor;import org.springframework.data.rest.core.annotation.RepositoryRestResource;@RepositoryRestResource(path = "user")public interface UserDao extends JpaRepository<User,Long>,JpaSpecificationExecutor<User> {}

测试类,插入1000条user数据

package com.lzx.code.codedemo;import com.lzx.code.codedemo.dao.RolesDao;import com.lzx.code.codedemo.dao.UserDao;import com.lzx.code.codedemo.entity.Roles;import com.lzx.code.codedemo.entity.User;import org.junit.Test;import org.junit.runner.RunWith;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.test.context.junit4.SpringRunner;@RunWith(SpringRunner.class)@SpringBootTestpublic class CodeDemoApplicationTests {    @Autowired    private UserDao userDao;    @Autowired    private RolesDao rolesDao;    @Test    public void contextLoads() {        User user = null;        Roles roles = null;        for(int i=0;i<1000;i++){            user = new User(                    null,                    "lzx"+i,                    "123456"            );            roles = new Roles(                    null,                    "角色"+i            );            rolesDao.save(roles);            userDao.save(user);            try {                Thread.sleep(100);            } catch (InterruptedException e) {                e.printStackTrace();            }        }    }}

效果:数据被分片存储到0~9的数据表中

如何使用Sharding-JDBC对数据进行分片处理 

如何使用Sharding-JDBC对数据进行分片处理

看完上述内容是否对您有帮助呢?如果还想对相关知识有进一步的了解或阅读更多相关文章,请关注编程网精选频道,感谢您对编程网的支持。

--结束END--

本文标题: 如何使用Sharding-JDBC对数据进行分片处理

本文链接: https://www.lsjlt.com/news/304374.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 如何使用Sharding-JDBC对数据进行分片处理
    如何使用Sharding-JDBC对数据进行分片处理,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。前言Sharding-JDBC是ShardingSphere的...
    99+
    2023-06-25
  • 使用Sharding-JDBC对数据进行分片处理详解
    目录前言一、加入依赖二、修改application.yml配置文件三、数据源定义四、数据源分配算法实现五、数据表分配算法六、数据源配置七、开始测试定义一个实体定义实体DAO测试类,插...
    99+
    2024-04-02
  • SpringBoot 如何使用sharding jdbc进行分库分表
    目录基于4.0版本,Springboot2.1在pom里确保有如下引用里面我profiles.active了另一个之后手工把表都建好写个测试代码需要注意一个坑基于4.0版本,Spri...
    99+
    2024-04-02
  • Java使用Sharding-JDBC分库分表进行操作
    目录主从库搭建Compose FileMaster 配置Slave 配置主从配置创建分库分表Order 1 库Order 2 库User 库Sharding-JDBC 引入Shard...
    99+
    2024-04-02
  • SpringBoot使用Sharding-JDBC实现数据分片和读写分离的方法
    目录一、Sharding-JDBC简介二、具体的实现方式 1、maven引用2、数据库准备3、Spring配置4、精准分片算法和范围分片算法的Java代码5、测试一、Sha...
    99+
    2024-04-02
  • 如何使用PHP对图片进行处理和操作?
    随着互联网的不断发展,图片已经成为人们在网上交流和传播信息的重要媒介。对于网站开发人员而言,对图片进行处理和操作是十分必要的。在众多的程序设计语言中,PHP是一门十分流行的语言,本文将介绍如何使用PHP对图片进行处理和操作。一、图片上传在网...
    99+
    2023-05-21
    PHP 图片处理 图片操作
  • 使用Go语言的切片对数据进行高效处理
    Golang小白一枚,正在不断学习积累知识,现将学习到的知识记录一下,也是将我的所得分享给大家!而今天这篇文章《使用Go语言的切片对数据进行高效处理》带大家来了解一下##content_title#...
    99+
    2024-04-04
  • 如何使用PHP进行大数据分析和处理?
    随着互联网和移动设备应用的普及,现在数据的规模越来越大,迅速增长。对于企业和政府机构来说,如何对这些海量的数据进行分析和处理,提取出有价值的信息是一个非常重要的问题。PHP语言是一种广泛应用于Web开发的开源语言。尽管它被广泛用作Web编程...
    99+
    2023-05-21
    PHP 处理 大数据分析
  • Android项目中如何使用adapter对数据进行处理
    本篇文章给大家分享的是有关Android项目中如何使用adapter对数据进行处理,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。具体如下:package com.cvte.ap...
    99+
    2023-05-31
    android adapter roi
  • 如何使用Python中的数据分析库进行数据处理
    如何使用Python中的数据分析库进行数据处理人们越来越重视数据处理和分析的重要性。随着电子设备的不断普及和互联网的发展,我们每天都会产生大量的数据。要从这些海量的数据中提取有用的信息和洞察,就需要使用强大的工具和技术。Python作为一种...
    99+
    2023-10-22
    Python 数据分析 数据处理
  • 使用Canvas怎么对图片进行处理
    这篇文章给大家介绍使用Canvas怎么对图片进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、主要API整个流程中所用到的主要Canvas API有:绘制图像: drawImage()获取图像数据: getIm...
    99+
    2023-06-09
  • 如何使用sharding-jdbc实现水平分库+水平分表
    这篇文章给大家分享的是有关如何使用sharding-jdbc实现水平分库+水平分表的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。分库分表策略:将id为偶数的存入到库1中,奇数存入到库2中,在每个库中,再根据学生的...
    99+
    2023-06-22
  • 利用Jdbc在对数据库进行连接
    利用Jdbc在对数据库进行连接?很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。Jdbc连接数据库的基本步骤package demo.jdbc;import jav...
    99+
    2023-05-31
    jdbc 数据库
  • 使用Rest如何对API进行处理
    这篇文章给大家介绍使用Rest如何对API进行处理,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。一、项目目标动静分离的架构,即客户端和服务器端的分离,客户端可以是IOS、android或者静态的页面。需要服务器端提供w...
    99+
    2023-05-31
    rest api
  • SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表
    小编给大家分享一下SpringBoot2如何整合Sharding-Jdbc中间件实现数据分库分表,希望大家阅读完这篇文章之后都有所收获,下面让我们一起去探讨吧!一、水平分割1、水平分库1)、概念:以字段为依据,按照一定策略,将一个库中的数据...
    99+
    2023-06-02
  • PHP 中如何使用数组进行数据处理?
    PHP是一种广泛应用于Web开发的脚本语言。在PHP中,数组是一种非常重要的数据结构,用于存储和处理大量数据。数组提供了一种方便的方式来组织和访问数据,使得数据处理变得更加容易和高效。在本文中,我们将介绍PHP中如何使用数组进行数据处理,希...
    99+
    2023-10-24
    数组 unix numpy
  • PHP中如何进行数据分析处理?
    PHP是一门广泛应用于Web开发的语言,通常被用来构建动态的Web应用程序。随着数据驱动型应用程序的兴起,PHP在数据分析和处理方面也变得越来越重要。本文将介绍如何使用PHP进行数据分析处理,从数据的获取、存储、分析和可视化展示等方面进行讲...
    99+
    2023-05-14
    数据处理 数据统计 PHP数据分析
  • 如何使用 PHP 函数进行数据预处理?
    php 数据预处理函数可用于进行类型转换、数据清理、日期和时间处理。具体来说,类型转换函数允许变量类型转换(例如 int、float、string);数据清理函数可删除或替换无效数据(如...
    99+
    2024-05-02
    数据预处理 php 函数
  • java如何对clob类型数据进行处理
    在Java中,可以使用`java.sql.Clob`接口来对CLOB类型数据进行处理。以下是一些常见的处理方法:1. 读取CLOB数...
    99+
    2023-10-30
    java
  • 如何使用C++进行流数据处理和实时分析?
    非常抱歉,由于您没有提供文章标题,我无法为您生成一篇高质量的文章。请您提供文章标题,我将尽快为您生成一篇优质的文章。...
    99+
    2024-05-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作