《Sharding-JDBC》——数据库分表+数据库脱敏实现方案

article/2025/11/10 21:12:40

本文从实际情况出发,解决生产中单表数据过大,和数据被拖库导致的问题,并进行的解决方案。本案例使用的框架为轻量型的jfinal,分表+数据库脱敏,均采用了Apache的shardingsphere

首先我们要先明确这样一个业务场景,如果生产上某个表的数据在100w+,那么sql语句进行表操作,还不会出现什么瓶颈问题,如果数据量再增加到500w+,可以通过索引,备份等方式,减少数据库的单表压力。如果继续增加到1000w。或者单表一天的数据量就能达到1000w。那么建议索引就无法在解决在这个问题。这时候,我们就需要通过分表的操作,来降低单表的压力。

实现思路:

  1. 上面我们已经知道了问题所在,下面来分析一下解决方案。既然单个表无法满足生产上是数据量,那么就需要创建多个表。而如何将多个表进行关联起来,我们就需要用到分表组件:ShardingSphere中的sharding-jdbc模块。

解决方案:(全部代码会在文末全部提供)

1.首先,我们数据库中只有一张表 t_blog。假设这张表的数据量已经达到的1000w的级别。接下来我们在创建8张表,表名为t_blog_x,这8张表的结构和原来的完全一样,这8张表我们把它称为真实表,而原来的t_blog表,我们称为逻辑表
在这里插入图片描述

2.创建好表之后,接下来进行代码部分实现。主要核心的class有下列三个。HashPreciseShardingAlgorithm为分表策略。ShardingCacheKit为缓存分表结果(可有可无)。ShardingDruidPlugin分表数据源配置。
在这里插入图片描述

3.紧接着,我们需要在配置文件中,配置之分表内容。

# 主数据源
master.jdbcUrl = jdbc:mysql://localhost/jfinal_demo?characterEncoding=utf8&useSSL=false&zeroDateTimeBehavior=convertToNull
master.user = root
master.password =123456## 分表规则 :对t_blog进分表,分表规则为根据id进行分表,共分为8张真实表
sharding = t_blog:8:iddevMode = true

4.在项目的主函数中配置分表代码。

	/*** 配置插件*/public void configPlugin(Plugins me) {// 配置 druid 数据库连接池插件Map<String,DruidPlugin> dataSourceMap = new HashMap<String, DruidPlugin>();DruidPlugin masterPlugin = new DruidPlugin(p.get("master.jdbcUrl"), p.get("master.user"), p.get("master.password").trim());dataSourceMap.put("jf_master",masterPlugin);// 配置分表规则ShardingRuleConfiguration shardingRuleConfiguration = new ShardingRuleConfiguration();shardingRuleConfiguration.setDefaultDataSourceName("jf_master");shardingRuleConfiguration.setEncryptRuleConfig(getOrderEncryptRuleConfiguration());List<TableRuleConfiguration> tableRuleConfigurations = new LinkedList<>();// 读取分表配置,生成分表规则String sharding = p.get("sharding");String [] rule = sharding.split(":");if(!Objects.isNull(rule)){// 1. 获得真实表数目int num = Integer.parseInt(rule[1]);// 2.// 获得逻辑表名String tableName = rule[0];// 3.// 分表字段String shardingColumn = rule[2];ShardingCacheKit.me().setCache(tableName,num);// 4.分表规则和生成分表表达式TableRuleConfiguration tableRuleConfiguration =new TableRuleConfiguration(tableName,"jf_master." + tableName + "_${0.. " + (num -1 ) +"}");// 5.配置分表策略StandardShardingStrategyConfiguration shardingStrategyConfiguration =new StandardShardingStrategyConfiguration(shardingColumn,new HashPreciseShardingAlgorithm());tableRuleConfiguration.setTableShardingStrategyConfig(shardingStrategyConfiguration);// 6. 加入策略tableRuleConfigurations.add(tableRuleConfiguration);shardingRuleConfiguration.setTableRuleConfigs(tableRuleConfigurations);}Properties props = new Properties();props.setProperty(ShardingPropertiesConstant.SQL_SHOW.getKey(),"true");// 加入分表插件ShardingDruidPlugin shardingDruidPlugin = new ShardingDruidPlugin(shardingRuleConfiguration,dataSourceMap,props);me.add(shardingDruidPlugin);// 配置ActiveRecord插件ActiveRecordPlugin arp = new ActiveRecordPlugin(shardingDruidPlugin);// 所有映射在 MappingKit 中自动化搞定_MappingKit.mapping(arp);me.add(arp);// 配置缓存插件me.add(new EhCachePlugin());}

5.然后启动项目进行测试,在这里我写了一个简单的save方法,接口返回uuid和该数据存在的真实表表名。

在这里插入图片描述

在这里插入图片描述

  1. 接口调用两次后,我们可以看到,两次的数据保存在了不同的表中。

7.接下来我们配置数据库脱敏。

	/*** 脱敏配置* @return*/private static EncryptRuleConfiguration getOrderEncryptRuleConfiguration() {EncryptRuleConfiguration encryptRuleConfiguration = new EncryptRuleConfiguration();Properties properties = new Properties();// 设置算法的密钥properties.setProperty("aes.key.value", "123456");// 将逻辑表t_blog的content列进行脱敏,算法采用AESEncryptorRuleConfiguration encryptorRuleConfiguration =new EncryptorRuleConfiguration("AES", "t_blog.content", properties);encryptRuleConfiguration.getEncryptorRuleConfigs().put("user_encryptor", encryptorRuleConfiguration);return encryptRuleConfiguration;}

8.两次数据库中的内容如下

在这里插入图片描述

在这里插入图片描述

该项目源码地址:
GitHub项目地址

参考文档:


shardingsphere官方网站

欢迎关注本人个人公众号,交流更多技术信息

在这里插入图片描述


http://chatgpt.dhexx.cn/article/21qFAnYQ.shtml

相关文章

mysql数据脱敏_数据脱敏|静态脱敏|动态脱敏—数据库脱敏_产品

1、敏感数据自动识别 数据脱敏系统可通过预定义敏感数据特征库&#xff0c;在任务执行过程中通过智能匹配识别敏感数据&#xff0c;最大限度的实现脱敏工作自动化&#xff0c;简化以手工方式按字段名定义敏感数据的繁琐工作。 2、丰富的脱敏算法 数据脱敏系统内置同义替换、数据…

使用sql语句对数据库脱敏

最近帮领导整理了一下数据库&#xff0c;给数据库的某些字段进行脱敏&#xff0c;现在整理一下&#xff0c;嘻嘻 1、姓名脱敏 update table set 列 REPLACE(列,SUBSTR(列,2,1),*) 姓名脱敏之后的效果&#xff1a; 2、手机号脱敏 UPDATE table SET 列 ( CASE WHEN 列 IS NO…

数据库脱敏(mybatis 拦截器实现)

1.使用数据库本身自有的函数进行加密 UPDATE tuc_user SET mobileNo HEX(AES_ENCRYPT(mobileNo, ‘xxxxxx’)); 2.注解类 2.1 SensitiveData package com.wisedu.campuses.sensitive;import java.lang.annotation.*;/*** author MR.MEI*/ Inherited Target({ElementType.T…

数据库安全关键技术之数据库脱敏技术详解

数据库脱敏是一种采用专门的脱敏算法对敏感数据进行变形、屏蔽、替换、随机化、加密&#xff0c;并将敏感数据转化为虚构数据的技术。按照作用位置、实现原理不同&#xff0c;数据脱敏可以划分为静态数据脱敏&#xff08;Static Data Masking, SDM )和动态数据脱敏&#xff08;…

网页数据库设计

这次是找一个网页,写er图,然后根据er图设计模型,然后生成数据库表 我找的是起点中文网,根据这个网站做了分析,画了e-r图. 模型

Java网页应用之实现对数据库的增、删、改、查。

模拟信息管理系统 通过eclipse实现网页、数据库的连接&#xff0c;实现对数据库的增、删、改、查。 登陆页面&#xff1a; 登陆成功界面&#xff1a; 添加信息界面&#xff1a; 修改信息界面&#xff1a; 删除信息界面&#xff1a; package com.lq.pro_user.dao;import …

(网页设计+数据库增删查改)——课设展示

注&#xff1a;关于网页所有的代码&#xff0c;我已经打包好了&#xff0c;获取方式如下 关注微信公众号大数据智库&#xff08;直接扫二维码&#xff0c;在我的主页的左下角&#xff09;&#xff0c;回复网页代码即可获取 课设展示 一、网页部分成果展示1、动态显示日期2、动态…

网页实现数据库的增删改查

最近在做项目web后台数据增删查改的时候&#xff0c;看到一篇较为详细的经典文章&#xff0c; 所以转载了下来&#xff0c; 文章出处在&#xff1a;https://blog.csdn.net/qq_32539825/article/details/70657340 如果作者认为侵权的告诉我&#xff0c;我立马删。 首先jsp 和…

通过JSP网页连接Mysql数据库

本文介绍通过JSP网页连接到MySQL,从MySQL数据库中读出一张表&#xff0c;并显示在JSP网页中。 1. 在MySQL数据库中建立数据表 用图形化管理工具Navicat Premium 连接MySQL数据库&#xff0c;在数据库“ming”下建立一张名为“teacher”的数据表。 2. 设置Tomcat 1)将JDBC…

网页连接mysql教程_网页怎么连接到数据库?

网页连接到数据库的方法&#xff1a;首先创建一个网页连接数据库的PHP代码文件&#xff1b;然后解决浏览器编码问题并指定数据库字符集&#xff1b;最后通过“mysql_select_db”函数选择并连接数据库即可。 HTML是无法读取数据库的&#xff0c;HTML是页面前端脚本语言&#xff…

网页JS自动化脚本(八)使用网页专属数据库indexedDB进行数据收集

我们在网页上进行的活动,往往都需要进行收集一些简单的数据,但是因为浏览器的安全原因,浏览器基本上是无法与本地的操作系统直接产生数据交互的,这本来就是一个由于安全问题生产的无解问题,在浏览器里面是内置了几种数据库的,其中一种就是indexedDB,可以用来储存一些非常小的数…

网页连接数据库,一个简单的登入界面以及实现登入功能

基于V#的ASP.NET.MVC 4 web 网站程序开发 接着上篇继续&#xff0c;上篇地址为https://blog.csdn.net/weixin_42534390/article/details/86576537 我们首先要有一个认知&#xff0c;就是ASP.NET.MVC 4 web 网站程序开发的三层架构概念&#xff0c;分别为BLL,DAL,MOD 这三层的概…

JavaWeb 网页链接数据库增删改查

今天是web的第五节课&#xff0c;上一节课只涉及到了查询和增加&#xff0c;这一节课我们学习网页链接数据库进行增删改查&#xff0c;今天的内容更多的也是代码&#xff0c;理论内容较少&#xff0c;现在小编带大家进入新的一课。 目录 一.查 二.增 三.删 四.修 五.数据库…

jsp登录注册代码(增删改查+网页+数据库)

目录 一登录注册代码以及效果 doregister.jsp:注册信息弹框 login.jsp:登录 dologin.jsp&#xff1a;与数据库相连、存放登陆的用户 index.jsp:主界面 update.jsp:修改 doup.jsp:修改页面&#xff08;帮助&#xff09; info.jsp&#xff1a;详情 dodel.jsp:删除界面 …

采集网页数据保存到MYSQL数据库

一、直接采集一个本地网页文件 1.创建一个网页文件date413.html(注&#xff1a;文件的路径后面还会用到) 2.网页文件date413.html中的内容为&#xff1a; <html> <head><title>搜索指数</title> </head> <body><table><tr>&…

用简单,易懂的方法将数据库和网页连接起来(例:登陆注册页面)

PHP技术&#xff0c;远比用java写代码连接数据库简单得多&#xff0c;下面看我的详细介绍&#xff1a; 1.首先要下载&#xff1a;phpstudy_pro&#xff08;关注我可以免费下载哦&#xff01;&#xff09; 2.然后打开phpstudy_pro&#xff0c;启动Apache服务器&#xff08;每次…

网页展示数据库内容

目的&#xff1a;写一个JSP访问Access数据库的user表&#xff0c;将所有的记录显示出来&#xff1b;ODBC数据源名为test&#xff0c;驱动类名为&#xff1a;“driverClassNamecom.mysql.jdbc.Driverr”&#xff0c;连接数据库的url为&#xff1a;”urljdbc:mysql://localhost:3…

[VS]网页连接数据库

工具&#xff1a; 1、Visual Studio(我使用的是vs2019) 2、SQL server(我使用的是sql2008) 3、网页运行框架&#xff1a;.Net2.0 目录 一、网站以windows身份验证连接数据库 二、网站以sql server身份验证连接数据库 三、使用工具Visual Studio中自带的连接数据库功能 一…

网页开发(十四)—数据库管理

书接上回&#xff1a; 7、MySQL指令 MySQL普通认知数据库文件夹数据表文件&#xff08;Excel文件&#xff09; 7.1 数据库管理&#xff08;文件夹&#xff09; &#xff08;1&#xff09;查看已有的数据库&#xff08;文件夹&#xff09;&#xff1a;show databases; &…

每周一品 · 音圈电机(VCM)中的磁性材料

音圈电机 (Voice coil motor, VCM) 是一种特殊形式的直驱电机&#xff0c;能将电能直接转化为直线运动机械能&#xff0c;其原理是在均匀气隙磁场中放入一个圆筒绕组&#xff0c;绕组通电产生磁场&#xff0c;带动负载设备做直线往复运动&#xff0c;改变电流的强弱和流向&…