# springboot-sharding-jdbc-demo **Repository Path**: java_han/springboot-sharding-jdbc-demo ## Basic Information - **Project Name**: springboot-sharding-jdbc-demo - **Description**: 使用当当开源的sharding-jdbc进行分库分表的demo - **Primary Language**: Java - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 5 - **Forks**: 0 - **Created**: 2017-07-07 - **Last Updated**: 2021-11-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ##springboot-sharding-jdbc-demo 当当开源的sharding-jdbc进行分库分表的demo ###Sharding-jdbc功能解析 Sharding-jdbc基本功能介绍,目前其支持内容如下: + SQL解析功能完善,支持聚合,分组,排序,LIMIT,OR等查询,并且支持级联表以及笛卡尔积的表查询 + 支持内、外连接查询 + 分片策略灵活,可支持=,BETWEEN,IN等多维度分片,也可支持多分片键共用,以及自定义分片策略 + 基于Hint的强制分库分表路由 + 目前仅支持MySQL数据库,未来会支持Oracle、SQLServer、DB2等数据库 注:[了解sharding-jdbc详细功能](http://dangdangdotcom.github.io/sharding-jdbc/01-start/features/ "详细功能") Sharding-jdbc SQL语句使用限制如下: + 不支持DDL语句 + 有限支持子查询 + 不支持HAVING + 不支持UNION 和 UNION ALL + 不支持特殊INSERT + 每条INSERT语句只能插入一条数据,不支持VALUES后有多行数据的语句 + 不支持DISTINCT聚合 + 不支持dual虚拟表 ###Sharding-jdbc快速使用 sharding-jdbc用于分库分表,使用时通常需要以下几步: 1. 项目引入sharding-jdbc核心模块依赖 2. 配置多个数据库的数据源 DataSource 3. 配置分布式主键生成算法 4. 配置分库、分表策略(指定分片字段)和分库、分表算法 ###Sharding-jdbc查询运行解析 使用单分片键分库算法和多分片键分表算法进行分库分表,对sharding-jdbc的查询过程分析如下: 1. SQL解析(SQLParseEngine):获取原始条件查询的SQL语句(即:代码中书写的逻辑SQL)。 2. SQL解析(SQLParseEngine):解析当前SQL,获取当前SQL的表、主键、查询条件(条件列名、条件类型、条件值等)、排序(Order by)、分页(limit)、分组(group by ) 的相关信息,具体信息见debug日志。 3. 通过分库算法获取目标数据库集合(DatabaseShardingAlgorithm):查询条件中存在**分库策略**中指定列时,调用单分片分库算法的相关方法(equalSharding、inSharding、betweenSharding)获取目标数据库名称集合; 如不存在分库策略中指定的列时,就会跳过**分库算法**调用,默认会使用所有数据名称集合作为目标数据库集合(会对所有数据库进行扫面)。 4. 通过分表算法获取目标数据表集合(TableShardingAlgorithm):如果条件中存在**分表策略**中指定的列时,调用多分片键分表算法的dosharding方法获取目标数据表名称集合。使用多分片键分表算法时虽然接口中只提供了一个dosharding 方法,但是在算法内部进行处理时,也需要根据查询条件的类型分三种情况进行处理,即:equal(=)、IN、between...and 三种情况;若查询条件中不存在分表策略中指定的列时, 同样也会跳过**分表算法**,默认会使用所有数据表名称集合作为目标数据表(即:会对所有的数据表进行扫描)。 5. SQL路由(SQL Route):根据获取的目标数据库名称集合与目标数据表集合组装真实查询语句,并进行查询获取查询结果。 6. 合并结果集(Merge ResultSet):对查询结果进行merge(合并)并返回。 ###Sharding-jdbc个人使用总结 1. sharding-jdbc的事务控制不够智能,目前只能是手动事物控制,用起来相对麻烦。 2. sharding-jdbc的查询分页也不够智能,需要开发者对sharding-jdbc分页查询出来的结果集进行排序、筛选处理后,才能拿到真正想要的查询结果。 注:sharding-jdbc分页和事物在具体使用时还需仔细研究。