探秘Sharding JDBC----分库分表操作

熟悉sharding JDBC的同学都知道,分库分表的操作是使用sharding JDBC中非常重要的,可能还有很多初学者对此阶段的学习存在疑虑,因此,接下来我会帮助你逐渐深入分库分表的操作。

环境准备

pom.xml

<parent>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-parent</artifactId>

<version>2.1.3.RELEASE</version></parent>

<properties>

<java.version>1.8</java.version>

<sharding.version>3.1.0</sharding.version></properties>

<dependencies>

<dependency>

<groupId>io.shardingsphere</groupId>

<artifactId>sharding-jdbc-core</artifactId>

<version>${sharding.version}</version>

</dependency>

<dependency>

<groupId>io.shardingsphere</groupId>

<artifactId>sharding-jdbc-spring-boot-starter</artifactId>

<version>${sharding.version}</version>

</dependency>

<dependency>

<groupId>com.alibaba</groupId>

<artifactId>druid</artifactId>

<version>1.1.10</version>

</dependency>

<dependency>

<groupId>org.mybatis</groupId>

<artifactId>mybatis</artifactId>

<version>3.4.5</version>

</dependency>

<dependency>

<groupId>org.mybatis.spring.boot</groupId>

<artifactId>mybatis-spring-boot-starter</artifactId>

<version>1.3.1</version>

</dependency>

<dependency>

<groupId>mysql</groupId>

<artifactId>mysql-connector-java</artifactId>

<version>5.1.46</version>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter</artifactId>

</dependency>

<dependency>

<groupId>org.projectlombok</groupId>

<artifactId>lombok</artifactId>

</dependency>

<dependency>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-starter-test</artifactId>

<scope>test</scope>

</dependency></dependencies>

<build>

<plugins>

<plugin>

<groupId>org.springframework.boot</groupId>

<artifactId>spring-boot-maven-plugin</artifactId>

</plugin>

</plugins></build>

domain

// 建立[email protected]@[email protected]@[email protected] class Employee {

private Long id;

private String name;}

配置类

@[email protected]("cn.wolfcode.sharding.mapper")public class ShardingApplication { }

分库分表

案例模型

把数据分别存放在两台服务器的两个数据库中表,通过分片算法来决定当前的数据存放在哪个数据库的哪个表中,由于一个连接池只能连接一个特定的数据库,所以这里需要创建多个连接池对象

建表

-- 分别在2台服务器中建立数据库sharding,并且建表employee_0和employee_1CREATE TABLE `employee_0` (

`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;-- ###################################CREATE TABLE `employee_1` (

`id` bigint(20) PRIMARY KEY AUTO_INCREMENT,

`name` varchar(255) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=utf8;

application.properties

# 定义连接池

sharding.jdbc.datasource.names=db0,db1

# 格式sharding.jdbc.datasource.连接池名.xxx:设置4要素信息

sharding.jdbc.datasource.db0.type=com.alibaba.druid.pool.DruidDataSource

sharding.jdbc.datasource.db0.driver-class-name=com.mysql.jdbc.Driver

sharding.jdbc.datasource.db0.url=jdbc:mysql://db0Ip:port/sharing

sharding.jdbc.datasource.db0.username=xxx

sharding.jdbc.datasource.db0.password=xxx

sharding.jdbc.datasource.db1.type=com.alibaba.druid.pool.DruidDataSource

sharding.jdbc.datasource.db1.driver-class-name=com.mysql.jdbc.Driver

sharding.jdbc.datasource.db1.url=jdbc:mysql://db1Ip:port/sharing

sharding.jdbc.datasource.db1.username=xxx

sharding.jdbc.datasource.db1.password=xxx

# 设置分库规则

# sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column:分库列

# sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression:分库算法

sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=id

sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=db$->{id % 2}

# 绑定逻辑表

sharding.jdbc.config.sharding.binding-tables=employee

# 设置分表规则

# sharding.jdbc.config.sharding.tables.逻辑表.actual-data-nodes:逻辑表对应的真实表

# sharding.jdbc.config.sharding.tables.逻辑表.table-strategy.inline.sharding-column:分表列

# sharding.jdbc.config.sharding.tables.逻辑表.table-strategy.inline.algorithm-expression:分表算法

# sharding.jdbc.config.sharding.tables.逻辑表.key-generator-column-name:主键列

sharding.jdbc.config.sharding.tables.employee.actual-data-nodes=db$->{0..1}.employee_$->{0..1}

sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.sharding-column=id

sharding.jdbc.config.sharding.tables.employee.table-strategy.inline.algorithm-expression=employee_$->{id % 2}

sharding.jdbc.config.sharding.tables.employee.key-generator-column-name=id

# 打印日志

sharding.jdbc.config.props.sql.show=true

mapper

/**

* 这里写的employee表是上面所配置的逻辑表

* 底层会根据分片规则,把我们写的逻辑表改写为数据库中的真实表

*/@Mapperpublic interface EmployeeMapper {

@Select("select * from employee")

List<Employee> selectAll();

@Insert("insert into employee (name) values (#{name})")

void inser(Employee entity);}

测试

@RunWith(SpringRunner.class)@SpringBootTest(classes=ShardingApplication.class)public class ShardingApplicationTests {

@Autowired

private EmployeeMapper employeeMapper;

@Test

public void save() {

for (int i = 0; i < 10; i++) {

Employee employee = new Employee();

employee.setName("xx"+i);

employeeMapper.inser(employee);

}

}

@Test

public void list() {

employeeMapper.selectAll().forEach(System.out::println);

}}

优缺点

  • 拆分后单表数据量比较小,单表大数据被拆分,解决了单表大数据访问问题
  • 分表以什么切分如果弄的不好,导致多次查询,而且有时候要跨库操作,甚至导致join无法使用,对排序分组等有性能影响
  • 之前的原子操作被拆分成多个操作,事务处理变得复杂
  • 多个DB维护成本增加

分库分表的操作并不难学,只是整个shardingJDBC的学习范围还是比较广,要学好也并不是那么容易的。平时一定要多学多练,遇到不会的问题及时请教,如果有需要我帮助的地方,我也会尽我所力帮助你学习。

原文地址:https://www.cnblogs.com/a1231230/p/12107573.html

时间: 2024-10-21 19:33:06

探秘Sharding JDBC----分库分表操作的相关文章

数据库-sharding之分库分表

1.分库分表(sharding)的原因 在网站初期,为了节约资源,常常部署单点(单一服务器)mysql作为数据存储.随着网站业务量增大,机器的性能有限,单点mysql的I/O性能瓶颈马 上达到高潮. ?为了突破单节点I/O的性能,聪明的架构师开始引入多节点,这就是所谓分库.如果说单节点是单线程串行计算,那么多节点就是多线程并行计算.多节 ?点的mysql服务借鉴了并行的思想,将原本对单点的操作分散到N台机器上,提升的效果明显. ?有可能我们的网站发展很迅速,每天的注册用户很多,然而这些注册用户都

MyBatis实现Mysql数据库分库分表操作和总结

阅读目录 前言 MyBatis实现分表最简单步骤 分离的方式 分离的策略 分离的问题 分离的原则 实现分离的方式 总结 前言 作为一个数据库,作为数据库中的一张表,随着用户的增多随着时间的推移,总有一天,数据量会大到一个难以处理的地步.这时仅仅一张表的数据就已经超过了千万,无论是查询还是修改,对于它的操作都会很耗时,这时就需要进行数据库切分的操作了. MyBatis实现分表最简单步骤 既然文章的标题都这么写了,不如直接上干货来的比较实际,我们就先来看看如何实现最简单的分表. 1.我们模拟用户表数

分库分表之第二篇

分库分表之第二篇 2. Sharding-JDBC快速入门 2.1需求说明 2.2. 环境建设 2.2.1环境说明 2.2.2创建数据库 2.2.3约会maven依赖 2.3 编写程序 2.3.1 分片规则配置 2.3.2 数据操作 2.3.3 测试 2.4. 流程分析 2.5 其他集成方式 2. Sharding-JDBC快速入门 2.1需求说明 使用Sharding-JDBC完成对订单表的水平分表,通过快速入门程序的开发,快速体验Sharding-JDBC的使用.人工创建两张表,t_orde

Sharding-Sphere 3.X 与spring与mybatis集成(分库分表)demo

最近在弄这个sharding-sphere,公司内部分库分表是在此业务代码上进行逻辑分库分表,但是这种总是不好,也调研了几款分库分表中间件.mycat.网易cetus.阿里DRDS.这几种就是背景强大,大公司经过大量的实战,成熟度很高,而框架sharding-sphere比较轻量级,最近比较火,它是以jar包形式提供服务,可以无缝连接ORM框架,并不需要额外的部署,不需要依赖,运维可以不需要改动,很多人都把sharding-sphere当成增强版的jdbc驱动,迁移代码其实没那么复杂.对于巨头公

【转】MySQL分库分表环境下全局ID生成方案

转载一篇博客,里面有很多的知识和思想值得我们去思考. —————————————————————————————————————————————————————————————————————— 在大型互联网应用中,随着用户数的增加,为了提高应用的性能,我们经常需要对数据库进行分库分表操作.在单表时代,我们可以完全依赖于数据库的自增ID来唯一标识一个用户或数据对象.但是当我们对数据库进行了分库分表后,就不能依赖于每个表的自增ID来全局唯一标识这些数据了.因此,我们需要提供一个全局唯一的ID号生成

数据库架构演变及分库分表

当生产环境中业务量激增,数据库数据量也会极具增加.当数据库的数据量达到一定程度时(数据库瓶颈),数据库宿主机负载超高,会严重影响业务,严重时会导致数据库宕机.为了避免这种极端情况的发生,我们应当在发生前做好预案,用于解决数据库数据量过载的问题.以下是我个人工作中使用的解决方案:1)数据库主从或多主多从方案2)数据库冷热数据拆分3)数据库分库分表操作4)在数据库前端增加缓存redis或memcached 一开始时,公司部分业务的架构如下(全都是单节点情况)经过自己强调该架构严重的缺点:节点单一,服

Sharding JDBC如何分库分表?看完你就会了

Sharding JDBC的操作分为配置使用.读写分离.分库分表以及应用等,今天我们主要来了解一下关于分库分表的操作,如果你对此感兴趣的话,那我们就开始吧. 环境准备 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.1.3.RELEASE

一小时读懂Sharding JDBC之分库分表

作为轻量级java框架,sharding JDBC在Java的jdbc层提供了额外的服务,可以理解为增强版的jdbc驱动.其中,分库分表的操作是其中的重要一环,接下来就跟随我来看一看,这一操作如何进行. 环境准备 pom.xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <v

转数据库分库分表(sharding)系列(二) 全局主键生成策略

本文将主要介绍一些常见的全局主键生成策略,然后重点介绍flickr使用的一种非常优秀的全局主键生成方案.关于分库分表(sharding)的拆分策略和实施细则,请参考该系列的前一篇文章:数据库分库分表(sharding)系列(一) 拆分实施策略和示例演示 本文原文连接: http://blog.csdn.net/bluishglc/article/details/7710738 ,转载请注明出处! 第一部分:一些常见的主键生成策略 一旦数据库被切分到多个物理结点上,我们将不能再依赖数据库自身的主键