《项目实战》使用JDBC手写分库

24 篇文章 5 订阅 ¥39.90 ¥99.00
16 篇文章 0 订阅


在这里插入图片描述

1、概要

在Mysql上手写数据库分库,技术栈:Java、JDBC、反射

2、整体架构流程

分库的重点是要制定出合适的分库规则,以及数据操作时,需要使用对应的路由规则。
在这里插入图片描述

3、技术名词解释

例如:

  • Mysql:关系型数据库,java程序通过jdbc访问、操作数据库
  • 分库:传统的关系型数据库,在表数据量增长到一定量级后(单表500万),查询速度显著下降,这时候需要把数据分散分拆到其他数据库,分散承担压力。

4、技术细节

4.1、指定分库规则

案例中分库规则:根据3取余,拆分为3个数据库(后缀0,1,2)

4.2、安装Mysql数据库以及建库建表

  • 安装mysql数据库
  • 按照分库规则创建数据库database,比如:store0,store1,store2
  • 创建订单表:order&#
  • 17
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 24
    评论
ShardingSphere是一款开源的分布式数据库中间件,它的前身是ShardingJDBC。ShardingSphere提供了分库分表、读写分离、分布式事务等功能,支持的数据库包括MySQL、Oracle、SQL Server等。 下面将介绍ShardingSphere的分库分表实战: 1. 引入依赖 在pom.xml文件中引入ShardingSphere的相关依赖: ``` <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>5.0.0-alpha</version> </dependency> <dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>5.0.0-alpha</version> </dependency> ``` 2. 配置数据源和分片规则 在application.yml文件中配置数据源和分片规则: ``` spring: datasource: name: ds type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: root sharding: tables: user: actualDataNodes: ds.user${0..1} tableStrategy: inline: shardingColumn: id algorithmExpression: user${id % 2} keyGenerateStrategy: column: id keyGeneratorName: snowflake order: actualDataNodes: ds.order${0..1} tableStrategy: inline: shardingColumn: id algorithmExpression: order${id % 2} keyGenerateStrategy: column: id keyGeneratorName: snowflake default-key-generator: type: SNOWFLAKE column: id ``` 上述配置中,我们定义了两个表user和order,分别分成两个库,每个库有两张表,使用id字段来进行分片。其中,key-generator用于生成分布式唯一ID,这里使用的是snowflake算法。 3. 配置数据源和事务管理器 在SpringBoot的启动类中配置数据源和事务管理器: ``` @SpringBootApplication @MapperScan("com.example.mapper") @EnableTransactionManagement @Import(ShardingDataSourceAutoConfiguration.class) public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public DataSource dataSource() throws SQLException { return ShardingDataSourceFactory.createDataSource(createDataSourceMap(), createShardingRuleConfiguration(), new Properties()); } private Map<String, DataSource> createDataSourceMap() { Map<String, DataSource> dataSourceMap = new HashMap<>(); DruidDataSource dataSource = new DruidDataSource(); dataSource.setDriverClassName("com.mysql.cj.jdbc.Driver"); dataSource.setUrl("jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=utf-8&useSSL=false"); dataSource.setUsername("root"); dataSource.setPassword("root"); dataSourceMap.put("ds", dataSource); return dataSourceMap; } private ShardingRuleConfiguration createShardingRuleConfiguration() { ShardingRuleConfiguration shardingRuleConfig = new ShardingRuleConfiguration(); shardingRuleConfig.getTableRuleConfigs().add(getUserTableRuleConfiguration()); shardingRuleConfig.getTableRuleConfigs().add(getOrderTableRuleConfiguration()); return shardingRuleConfig; } private TableRuleConfiguration getUserTableRuleConfiguration() { TableRuleConfiguration result = new TableRuleConfiguration("user", "ds.user${0..1}"); result.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("id", "user${id % 2}")); result.setKeyGenerateStrategyConfig(new KeyGenerateStrategyConfiguration("id", "snowflake")); return result; } private TableRuleConfiguration getOrderTableRuleConfiguration() { TableRuleConfiguration result = new TableRuleConfiguration("order", "ds.order${0..1}"); result.setTableShardingStrategyConfig(new InlineShardingStrategyConfiguration("id", "order${id % 2}")); result.setKeyGenerateStrategyConfig(new KeyGenerateStrategyConfiguration("id", "snowflake")); return result; } @Bean public PlatformTransactionManager txManager(final DataSource dataSource) { return new DataSourceTransactionManager(dataSource); } } ``` 4. 编写业务代码 在业务代码中,我们可以使用分片后的数据源来进行CRUD操作,例如: ``` @Service @Transactional public class UserService { @Autowired private UserMapper userMapper; public Long insert(User user) { userMapper.insert(user); return user.getId(); } public void delete(Long id) { userMapper.deleteByPrimaryKey(id); } public User select(Long id) { return userMapper.selectByPrimaryKey(id); } public void update(User user) { userMapper.updateByPrimaryKey(user); } } ``` 在这个例子中,我们使用了@Transactional注解来开启事务,使用了UserMapper来进行CRUD操作。 以上就是ShardingSphere分库分表的实战介绍。
评论 24
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

青花科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值