LZ工作快5年了,一直没有接触过数据库分库分表的业务,这不最近借助跳槽的动力,自己搞了一波,用的是dangdang开源的一个分库分表插件,实现了简单的分库分表的功能,话不多说,代码开路,github地址https://github.com/dangdangdotcom/sharding-jdbc。
首先是jar包引用,maven以来如下
<dependency> <groupId>com.dangdang</groupId> <artifactId>sharding-jdbc-core</artifactId> <version>1.3.3</version> </dependency> <dependency> <groupId>com.dangdang</groupId> <artifactId>sharding-jdbc-config-spring</artifactId> <version>1.3.3</version> </dependency>
然后就是spring配置,单独建了一个文件,主xml中import一下,配置数据源和分库分表规则,目前的规则逻辑都是按照id%2配置的,具体应用按照自己实际业务来。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:rdb="http://www.dangdang.com/schema/ddframe/rdb" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.dangdang.com/schema/ddframe/rdb http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd"> <bean id="statFilter" class="com.alibaba.druid.filter.logging.Slf4jLogFilter"> <property name="statementExecutableSqlLogEnable" value="false"/> <property name="dataSourceLogEnabled" value="false"/> </bean> <bean id="logFilter" class="com.alibaba.druid.filter.stat.StatFilter"> <property name="slowSqlMillis" value="50"/> <property name="logSlowSql" value="false"/> <property name="mergeSql" value="true"/> </bean> <bean id="master0" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="username" value="root"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/demodb00"/> <property name="password" value="root"/> <property name="maxActive" value="10"/> <property name="initialSize" value="1"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="1"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="50"/> <property name="maxOpenPreparedStatements" value="100"/> <property name="proxyFilters"> <list> <ref bean="statFilter"/> <ref bean="logFilter"/> </list> </property> </bean> <bean id="master1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="username" value="root"/> <property name="url" value="jdbc:mysql://127.0.0.1:3306/demodb01"/> <property name="password" value="root"/> <property name="maxActive" value="10"/> <property name="initialSize" value="1"/> <property name="maxWait" value="60000"/> <property name="minIdle" value="1"/> <property name="timeBetweenEvictionRunsMillis" value="60000"/> <property name="minEvictableIdleTimeMillis" value="300000"/> <property name="validationQuery" value="SELECT 'x'"/> <property name="testWhileIdle" value="true"/> <property name="testOnBorrow" value="false"/> <property name="testOnReturn" value="false"/> <property name="poolPreparedStatements" value="true"/> <property name="maxPoolPreparedStatementPerConnectionSize" value="50"/> <property name="maxOpenPreparedStatements" value="100"/> <property name="proxyFilters"> <list> <ref bean="statFilter"/> <ref bean="logFilter"/> </list> </property> </bean> <!--非必须的,可以省略掉,下面的rdb:sharding-rule直接配置数据源id即可> <rdb:master-slave-data-source id="rbb_0" master-data-source-ref="master0" slave-data-sources-ref="master0"/> <rdb:master-slave-data-source id="rbb_1" master-data-source-ref="master1" slave-data-sources-ref="master1"/> <rdb:strategy id="idDbSharding" sharding-columns="id" algorithm-class="net.aty.spring.DbAlgorithm"/> <rdb:strategy id="idTbSharding" sharding-columns="id" algorithm-class="net.aty.spring.TbAlgorithm"/> <rdb:data-source id="wholeDataSource"> <rdb:sharding-rule data-sources="rbb_0,rbb_1"> <rdb:table-rules> <rdb:table-rule logic-table="user" actual-tables="user_${0..1}" database-strategy="idDbSharding" table-strategy="idTbSharding"/> </rdb:table-rules> </rdb:sharding-rule> </rdb:data-source> </beans>
接下来是分库分表规则类
package com.feng.splitdbtb; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.database.SingleKeyDatabaseShardingAlgorithm; import java.util.Collection; public class DbAlgorithm implements SingleKeyDatabaseShardingAlgorithm<Integer> { @Override public String doEqualSharding(Collection<String> collection, ShardingValue<Integer> shardingValue) { int id = shardingValue.getValue(); int index = id % 2; for (String each : collection) { if (each.endsWith(index + "")) { return each; } } throw new UnsupportedOperationException(); } @Override public Collection<String> doInSharding(Collection<String> collection, ShardingValue<Integer> shardingValue) { return null; } @Override public Collection<String> doBetweenSharding(Collection<String> collection, ShardingValue<Integer> shardingValue) { return null; } }
分表规则类
package com.feng.splitdbtb; import com.dangdang.ddframe.rdb.sharding.api.ShardingValue; import com.dangdang.ddframe.rdb.sharding.api.strategy.table.SingleKeyTableShardingAlgorithm; import java.util.Collection; public class TbAlgorithm implements SingleKeyTableShardingAlgorithm<Integer> { @Override public String doEqualSharding(Collection<String> availableTargetNames, ShardingValue<Integer> shardingValue) { int id = shardingValue.getValue(); int index = id % 2; for (String each : availableTargetNames) { if (each.endsWith(index + "")) { return each; } } throw new UnsupportedOperationException(); } @Override public Collection<String> doInSharding(Collection<String> availableTargetNames, ShardingValue<Integer> shardingValue) { return null; } @Override public Collection<String> doBetweenSharding(Collection<String> availableTargetNames, ShardingValue<Integer> shardingValue) { return null; } }
最后是建库建表语句,我只给一个例子,具体的数据库包括dbdemo00(表user_0,user_1),dbdemo01(表user_0,user_1)
drop database if exists demodb00; CREATE database demodb00 DEFAULT CHARACTER SET utf8; CREATE TABLE demodb00.user ( id int(11) NOT NULL AUTO_INCREMENT, name varchar(100) DEFAULT NULL, age int(11) DEFAULT NULL, PRIMARY KEY (id), UNIQUE KEY id_UNIQUE (id) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
聪明的你是不是会问,多数据库提交的事务问题啊,下一篇介绍分布式事务atomikos
相关推荐
MySQL分库分表是一种数据库架构优化技术,其目的是为了提高大型数据库系统的性能和可扩展性。在面对大规模数据和高并发访问时,单库单表往往难以满足需求,分库分表就成为了必要之选。分库分表技术可以将数据分散...
**MySQL分库分表技术** 随着互联网业务的快速发展,数据量呈现爆炸性增长,单个数据库的性能瓶颈问题日益突出。在这种背景下,MySQL的分库分表技术应运而生,旨在解决高并发、大数据量场景下的性能挑战。本篇将深入...
一个MySQL分库分表php类。当一个表数据记录过大时就会出现性能瓶颈,而一般对应的解决办法是要么做分区表,要么分表,分区表就不说了,分表又分为垂直分割和水平分割,具体区 别请自行搜索。一般而言,分库分表属于...
在实现MySQL分库分表的过程中,通常会遇到一些挑战,如数据一致性、事务处理、跨库跨表查询等。为了应对这些问题,可以使用以下技术: 1. **ShardingSphere**:Apache ShardingSphere是一个开源的分布式数据库解决...
这里的“mysql分库分表分区1”主要讨论的是 MySQL 中的表分区技术,这是一种将大表物理分割为多个更小、更易管理的部分的方法。下面将详细介绍四种常见的分区类型:RANGE、LIST、HASH 和 KEY。 1. **RANGE分区**: ...
MySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库分表课件.zipMySQL分库...
MySQL分库分表还有其他考虑因素,如数据一致性、事务处理、跨表查询等。在分库分表后,通常需要避免跨库查询,因为这会导致性能下降。可以通过设计良好的API和业务逻辑,尽量在单个数据库中完成大部分操作。此外,还...
在数据库架构设计和系统性能优化的领域中,MySQL分库分表技术是处理大规模数据和应对高并发请求的重要手段。随着数据量的快速增长和业务需求的不断提升,传统的单一数据库架构已经很难满足现代互联网应用的性能要求...
"MySQL 分库分表无限扩容后的瓶颈及解决方案" MySQL 是一个非常popular 的数据库管理系统,广泛应用于各行各业。随着业务的发展,数据量也在不断增长,数据库的性能和容量也将面临着极大的挑战。这篇文章将讨论 ...
《19道MySQL分库分表高频题整理(附答案背诵版)》是一份专门针对MySQL分库分表技术的高频考题集,旨在帮助数据库管理员、后端开发人员以及准备相关面试的考生全面掌握MySQL分库分表的核心概念和实际操作。通过详细的...
分享一个MySQL分库分表php类。当一个表数据记录过大时就会出现性能瓶颈,而一般对应的解决办法是要么做分区表,要么分表,分区表就不说了,分表又分为垂直分割和水平分割,具体区 别请自行搜索。一般而言,分库分表...
**MySQL分库分表中间件Heisenberg详解** 在数据库设计中,随着业务的发展和数据量的增加,单个数据库往往难以承受高并发和大数据量的处理压力,这时就需要引入分库分表策略来优化系统性能。Heisenberg是一款开源的...
MySQL 分库分表查询工具——Shard 在大型的互联网应用中,数据库的性能瓶颈往往成为系统扩展性的关键因素。为了应对高并发、大数据量的挑战,MySQL 数据库的分库分表策略被广泛采用。分库是将数据分散到多个独立的...
为了解决这一问题,"Mysql分库分表实例" 提供了一种解决方案——数据分片技术,即通过分库分表来提升数据库的读写效率。 分库分表是数据库水平扩展的一种策略,它的核心思想是将一个大的数据库拆分成多个小的数据库...
在这个“mysql分库分表-shardingmysql.zip”压缩包中,我们重点关注的是如何使用 ShardingSphere 来实现 MySQL 的分库分表。 首先,理解分库分表的基本概念。分库是将一个大型数据库拆分成多个小型数据库,每个...
MyCat 实现 MySQL 分库分表 MyCat 是一个开源的 MySQL 中间件,可以帮助实现 MySQL 的分库分表。下面是使用 MyCat 实现 MySQL 分库分表的知识点总结: 一、MyCat 安装 * 使用 wget 命令下载 MyCat 服务器 * 使用 ...
### MySQL分库分表策略详解 #### 一、场景与系统分析 在互联网技术日新月异的今天,数据量的快速增长对数据库系统的性能提出了更高要求。为了应对这些挑战,许多企业选择实施分库分表策略。分库分表是指将原来单一...
MySQL分库分表是一种应对大数据量和高并发场景下的数据库优化策略,旨在提高数据库系统的性能、可用性和可扩展性。MYCAT(曾用名:Maatkit)是一款开源的数据库中间件,它允许开发者将MySQL数据库集群化,实现分库...
<?php namespace App\Model\Database; class Config { public $dsn; public $user;...这是一个非常好用的MySQL分库分表的PHP类,需要的朋友可以下载使用,更多精彩尽在在PHP中文网。
1. **MyCat**:开源的MySQL分库分表中间件,支持自动路由、分布式事务等。 2. **ShardingSphere**:Apache孵化器项目,提供分库分表、读写分离等功能,兼容多种数据库。 3. **OceanBase**:阿里巴巴开源的分布式...