sharding-JDBC分库分表配置分析
什么是ShardingSphere
Apache ShardingSphere 由 JDBC、Proxy 和 Sidecar(规划中)这 3 款既能够独⽴部署,⼜⽀持混合部署配合使⽤的产品组成。 它们均提供标准化的基于数据库作为存储节点的增量功能,可适⽤于如 Java 同构、异构语⾔、云原⽣等各种多样化的应⽤场景。
详细资料点击.
分库分表解决什么问题
为什么要分库分表?
分库分表就是为了解决由于数据量(⽐如电商的订单)过⼤⽽导致数据库性能(CPU、内存、磁盘、⽹络)降低的问题,将原本单个数据库拆分成多个数据库 ,将数据量⼤的表拆分成若⼲个数据表,使得单⼀数据库、单⼀数据表的数据量变⼩,从⽽达到提升数据库性能的⽬的。
分库分表的四种⽅式:垂直分库、垂直分表、⽔平分库和⽔平分表
垂直分库:
通过将表按业务分类,然后分布在不同数据库,并且可以将这些数据库部署在不同服务器上,从⽽达到多个服务器共同分摊压⼒的效果,⼤⼤提⾼性能。但是依然没有解决单表数据量过⼤的问题,且需要解决跨库带来的复杂性问题。
垂直分表:
把⼀个字段⽐较多的表按照字段访问频次冷热程度、是否是⼤字段的原则拆分为多个表,这样既能使业务清晰,还能提升部分性能。拆分后,尽量从业务⾓度避免联查,否则性能⽅⾯将得不偿失。
⽔平分库:
把⼀张表的数据(数据⾏)按⼀定规则拆分到不同的数据库中,每个库只有这个表的部分数据,这些数据库可以分布在不同的服务器上,从⽽使访问压⼒被多服务器负载,提升性能。它不仅需要解决跨库带来的问题,还需要解决数据路由的问题。
⽔平分表:
把⼀张表的数据(数据⾏)分到多个同⼀个数据库的多张表中,每个表只有这个表的部分数据,解决单表数据量过⼤⽽产⽣的性能问题,它仅仅作为⽔平分库的⼀个补充优化。
数据库相关优化⽅案
软件层⾯包括:SQL调优、表结构优化、读写分离、数据库集、分库分表等。
硬件层⾯主要是增加机器性能。
如果出现数据库问题不要着急分库分表,分库分表会给系统带来巨⼤的复杂性,不到万不得已前提下建议不要使⽤分库分表。
两种情况下:
当数据量随着业务量的提升不断增⼤,但访问数据库压⼒不是特别⼤的情况下,我们⾸先考虑缓存、读写分离、索引等技术⽅案。
当数据量特别⼤并且持续增长时,即将或者已经出现性能瓶颈时,可以考虑分库分表⽅案。
更加详细的可以看这两篇⽂章:
.
.
Springboot整合Sharding-JDBC
ShardingJDBC简介
定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使⽤客户端直连数据库,以 jar 包形式提供服务,⽆需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。
适⽤于任何基于 JDBC 的 ORM 框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template 或直接使⽤ JDBC。
⽀持任何第三⽅的数据库连接池,如:DBCP, C3P0, BoneCP, HikariCP 等。
⽀持任意实现 JDBC 规范的数据库,⽬前⽀持 MySQL,PostgreSQL,Oracle,SQLServer 以及任何可使⽤ JDBC 访问的数
据库。
Sharding-JDBC核⼼配置
分⽚规则
分⽚规则配置的总⼊⼝。包含数据源配置、表配置、绑定表配置以及读写分离配置等
数据源配置
真实数据源列表
表配置
逻辑表名称、数据节点与分表规则的配置
数据节点配置
⽤于配置逻辑表与真实表的映射关系。可分为均匀分布和⾃定义分布两种形式
分⽚策略配置
对于分⽚策略存有数据源分⽚策略和表分⽚策略两种维度
数据源分⽚策略
对应于DatabaseShardingStrategy。⽤于配置数据被分配的⽬标数据源
表分⽚策略
对应于TableShardingStrategy。⽤于配置数据被分配的⽬标表,该⽬标表存在与该数据的⽬标数据源内。故表分⽚策略是依赖与数据源分⽚策略的结果的
⾃增主键⽣成策略
通过在客户端⽣成⾃增主键替换以数据库原⽣⾃增主键的⽅式,做到分布式主键⽆重复。
SpringBoot整合Sharding-JDBC实现代码
在这⾥我们主要基于JavaConfig配置的⽅式来集成到SpringBoot中,代码如下:
在这⾥我们主要基于JavaConfig配置的⽅式来集成到SpringBoot中,代码如下:
1、pom⽂件中添加Sharding-JDBC和MySQL驱动依赖,以及其他的相关依赖,我这⾥使⽤的是阿⾥巴巴Druid数据库连接池。
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<version>${spring-boot.version}</version>
<scope>test</scope>
</dependency>
jpa mybatis<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-aop</artifactId>
<version>${spring-boot.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context-support</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>${pagehelper.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>${mysql.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
<dependency>
<groupId>joda-time</groupId>
<artifactId>joda-time</artifactId>
<version>${joda.time.version}</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>${fastjson.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<scope>compile</scope>
<exclusions>
<exclusion>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
</exclusion>
</exclusions>
<version>4.1.1</version>
</dependency>
<!-- mvnrepository/artifact/org.apache.curator/curator-recipes -->
<dependency>
<groupId>org.apache.curator</groupId>
<groupId>org.apache.curator</groupId>
<artifactId>curator-recipes</artifactId>
<version>4.2.0</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
</dependency>
</dependencies>
2、配置数据源(两个数据库)
spring:
shardingsphere:
datasource:
# 数据源:shard_one
dataOne:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driverClassName: sql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shard_one?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root
password:123456
initial-size:10
max-active:100
min-idle:10
max-wait:60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size:20
time-between-eviction-runs-millis:60000
min-evictable-idle-time-millis:300000
max-evictable-idle-time-millis:60000
validation-query: SELECT 1 FROM DUAL
# validation-query-timeout: 5000
test-on-borrow: false
test-on-return: false
test-while-idle: true
connectionProperties: Sql=true;druid.stat.slowSqlMillis=5000
# 数据源:shard_two
dataTwo:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driverClassName: sql.jdbc.Driver
url: jdbc:mysql://localhost:3306/shard_two?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false username: root
password:123456
initial-size:10
max-active:100
min-idle:10
max-wait:60000
pool-prepared-statements: true
max-pool-prepared-statement-per-connection-size:20
time-between-eviction-runs-millis:60000
min-evictable-idle-time-millis:300000
max-evictable-idle-time-millis:60000
validation-query: SELECT 1 FROM DUAL
# validation-query-timeout: 5000
test-on-borrow: false
test-on-return: false
test-while-idle: true
connectionProperties: Sql=true;druid.stat.slowSqlMillis=5000
3、创建两个数据库dataOne的实例
public class TableOne {
private Long id;
private Long id;
private String phone;
private String name;
public Long getId(){
return id;
}
public void setId(Long id){
this.id = id;
}
public String getPhone(){
return phone;
}
public void setPhone(String phone){
this.phone = phone;
}
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public String getSex(){
return sex;
}
public void setSex(String sex){
this.sex = sex;
}
private String sex;
}
4、创建TableOne数据访问接⼝
public interface TableOneService {
void createTable();
void insertOne();
List<TableOne>selectOneByPhone(String phone);
}
5、创建TableOne数据访问实现类
@Service
public class TableOneServiceImpl implements TableOneService {
@Resource
private TableOneMapper tableOneMapper ;
@Autowired
@Qualifier("dataOneTemplate")
private JdbcTemplate dataOneTemplate ;
@Autowired
@Qualifier("dataTwoTemplate")
private JdbcTemplate dataTwoTemplate ;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论