摘要:实现数据库分库分表可以自己实现,也可以使用和实现。分布式数据库的自增不是自增的。分布式数据库分页查询需要使用插入时间实现。包含分库分片和读写分离功能。
Sharding-Jdbc实现mysql分库分表 简单介绍
数据库分库分表和读写分离区别,分库分表是在多个库建相同的表和同一个库建不同的表,根据随机或者哈希等方式查找实现。读写分离是为了解决数据库的读写性能不足,使用主库master进行写操作,从库slave进行读操作,通过binglog实现主被库数据的同步。
实现数据库分库分表可以自己实现,也可以使用mycat和sharding-jdbc实现。
(1)olap和oltp联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line Analytical Processing)。OLTP是传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。OLAP是数据仓库系统的主要应用,支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。
(2)分布式数据库的自增ID不是自增的。分布式数据库分页查询需要使用插入时间实现。
(3)explain命令,explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。在select语句前面加上就可以。
sharding-jdbc是当当网开源的一款客户端代理中间价。sharding-jdbc包含分库分片和读写分离功能。对应用的代码没有侵入型,几乎没有任何改动,兼容主流orm框架,主流数据库连接池。目前属于apache的孵化项目shardingSphere,发展迅猛。sharding-jdbc实现实现读写分离不能实现主从库数据同步
Sharding-Jdbc使用(Spring boot)(1)创建sharding-jdbc项目和数据库 ds_master_0,ds_master_1,ds_master_0_slave_0,ds_master_1_slave_0
create table order0 ( id bigint(11) not null comment "主键ID" primary key, user_id bigint(11) null comment "用户ID", order_id bigint(11) null comment "订单ID" ); create table order1 ( id bigint(11) not null comment "主键ID" primary key, user_id bigint(11) null comment "用户ID", order_id bigint(11) null comment "订单ID" );
(2)添加依赖
io.shardingsphere sharding-jdbc-spring-boot-starter 3.0.0 com.alibaba druid-spring-boot-starter 1.1.13 mysql mysql-connector-java runtime org.mybatis.spring.boot mybatis-spring-boot-starter 2.1.0
(3)配置文件
spring.application.name=sharding-jdbc #mybatis mybatis.configuration.map-underscore-to-camel-case=true mybatis.mapper-locations=classpath:mapper/*Mapper.xml #当注册遇到相同名字是否允许被注册,在配置中心无效 spring.main.allow-bean-definition-overriding=true #所有主从库 sharding.jdbc.datasource.names=dsmaster0,dsmaster1,dsmaster0slave0,dsmaster1slave0 #dsmaster0 sharding.jdbc.datasource.dsmaster0.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster0.url=jdbc:mysql://ailijie.top:3306/ds_master_0?useSSL=false sharding.jdbc.datasource.dsmaster0.username=root sharding.jdbc.datasource.dsmaster0.password= #slave for ds_master_0 sharding.jdbc.datasource.dsmaster0slave0.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster0slave0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster0slave0.url=jdbc:mysql://ailijie.top:3306/ds_master_0_slave_0?useSSL=false sharding.jdbc.datasource.dsmaster0slave0.username=root sharding.jdbc.datasource.dsmaster0slave0.password= #dsmaster1 sharding.jdbc.datasource.dsmaster1.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster1.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster1.url=jdbc:mysql://ailijie.top:3306/ds_master_1?useSSL=false sharding.jdbc.datasource.dsmaster1.username=root sharding.jdbc.datasource.dsmaster1.password= #slave for ds_master_1 sharding.jdbc.datasource.dsmaster1slave0.type=com.alibaba.druid.pool.DruidDataSource sharding.jdbc.datasource.dsmaster1slave0.driver-class-name=com.mysql.cj.jdbc.Driver sharding.jdbc.datasource.dsmaster1slave0.url=jdbc:mysql://ailijie.top:3306/ds_master_1_slave_0?useSSL=false sharding.jdbc.datasource.dsmaster1slave0.username=root sharding.jdbc.datasource.dsmaster1slave0.password= #分库规则 sharding.jdbc.config.sharding.default-database-strategy.inline.sharding-column=user_id sharding.jdbc.config.sharding.default-database-strategy.inline.algorithm-expression=dsmaster${user_id % 2} #分表规则 sharding.jdbc.config.sharding.tables.order.actual-data-nodes=dsmaster${0..1}.order${0..1} sharding.jdbc.config.sharding.tables.order.table-strategy.inline.shardingColumn=order_id sharding.jdbc.config.sharding.tables.order.table-strategy.inline.algorithmExpression=order${order_id % 2} #使用id作为分布式主键 sharding.jdbc.config.sharding.tables.order.key-generator-column-name=user_id #逻辑主从库名和实际主从库映射关系 #sharding.jdbc.config.sharding.master-slave-rules.ds0.master-data-source-name=dsmaster0 #用逗号分隔 #sharding.jdbc.config.sharding.master-slave-rules.ds0.slave-data-source-names=dsmaster0 #sharding.jdbc.config.sharding.master-slave-rules.dsmaster1.masterDataSourceName=dsmaster1 #sharding.jdbc.config.sharding.master-slave-rules.dsmaster1.slaveDataSourceNames=dsmaster1slave0
(5)实体类 Order
@Data @Builder @NoArgsConstructor @AllArgsConstructor public class Order implements Serializable { private static final long serialVersionUID = 427226138907372838L; private Long id; private Integer userId; private Integer orderId; }
(4)controller外部接口
@Slf4j @RequestMapping("sharding") @RestController public class ShardingController { @Autowired private OrderMapper orderMapper; @RequestMapping public String helloShardin(){ return "hello Sharding-jdbc"; } @RequestMapping("insert") public void insert(@RequestParam Integer orderId, @RequestParam Integer userId) { Order order = Order.builder() .orderId(orderId).userId(userId).build(); orderMapper.insert(order); Long id = order.getId(); log.info("Generated Key--id:" + id); } @RequestMapping("queryAll") public void findAll() { Listorders = orderMapper.queryAll(); log.info("user:{}", orders); log.info("user:{}",orders.size()); } @RequestMapping("getById") public void getById(@RequestParam Long id) { Order order = orderMapper.queryById(id); log.info("user:{}", order); } @RequestMapping("getByUserId") public void getByUserId(@RequestParam Long userId) { List orders = orderMapper.queryByUserId(userId); log.info("user:{}", orders); } @RequestMapping("deleteById") public void deleteById(@RequestParam Long id) { orderMapper.deleteById(id); log.info("user:{}", id); } }
使用sharding-jdbc没有侵入性,不会影响业务代码。
可以使用Springboot的配置文件规范进行配置。
有问题,请留言!
个人博客地址 欢迎访问
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75650.html
摘要:现在的分片策略是上海深圳分别建库,每个库都存各自交易所的两支股票的,且按照月分表。五配置分片策略数据库分片策略在这个实例中,数据库的分库就是根据上海和深圳来分的,在中是单键分片。 由于当当发布了最新的Sharding-Sphere,所以本文已经过时,不日将推出新的版本 项目中遇到了分库分表的问题,找到了shrding-jdbc,于是就搞了一个springboot+sharding-jd...
摘要:今天就给大家介绍下方式的使用,主要讲解读写分离的配置,其余的后面再介绍。主要还是用提供的,配置如下配置内容如下主数据源从数据源读写分离配置查询时的负载均衡算法,目前有种算法,轮询和随机,算法接口是。 在我《Spring Cloud微服务-全栈技术与案例解析》书中,第18章节分库分表解决方案里有对Sharding-JDBC的使用进行详细的讲解。 之前是通过XML方式来配置数据源,读写分离...
阅读 1495·2021-10-11 10:59
阅读 1857·2021-09-09 11:36
阅读 1367·2019-08-30 15:55
阅读 1321·2019-08-29 11:20
阅读 3056·2019-08-26 13:39
阅读 1457·2019-08-26 13:37
阅读 1950·2019-08-26 12:11
阅读 1312·2019-08-23 14:28