##Sharding-JDBC - A JDBC driver for shard databases and tables
`Sharding-JDBC`是当当应用框架`ddframe`中,关系型数据库模块`dd-rdb`中分离出来的数据库水平扩展框架,即透明化数据库分库分表访问。
`Sharding-JDBC`继`dubbox`和`elastic-job`之后,是`ddframe`系列开源的第三个产品。
# Release Notes
* sharding-jdbc [![Maven Status](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc)
* sharding-jdbc-core [![Maven Status](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-core/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-core)
* sharding-jdbc-config-yaml [![Maven Status](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-config-yaml/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-config-yaml)
* sharding-jdbc-config-spring [![Maven Status](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-config-spring/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-config-spring)
* sharding-jdbc-transaction [![Maven Status](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-transaction/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-transaction)
* sharding-jdbc-transaction-async-job [![Maven Status](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-transaction-async-job/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-transaction-async-job)
* sharding-jdbc-self-id-generator [![Maven Status](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-self-id-generator/badge.svg)](https://maven-badges.herokuapp.com/maven-central/com.dangdang/sharding-jdbc-self-id-generator)
# License
[![Hex.pm](http://dangdangdotcom.github.io/sharding-jdbc/img/license.svg)](http://www.apache.org/licenses/LICENSE-2.0.html)
# Build Status
[![Build Status](https://secure.travis-ci.org/dangdangdotcom/sharding-jdbc.png?branch=master)](https://travis-ci.org/dangdangdotcom/sharding-jdbc)
[![Coverage Status](https://coveralls.io/repos/dangdangdotcom/sharding-jdbc/badge.svg?branch=master&service=github)](https://coveralls.io/github/dangdangdotcom/sharding-jdbc?branch=master)
# 主要贡献者
* 张亮 [当当](http://www.dangdang.com/) zhangliang@dangdang.com
* 高洪涛 [当当](http://www.dangdang.com/) gaohongtao@dangdang.com
* 曹昊 [当当](http://www.dangdang.com/) caohao@dangdang.com
* 岳令 [当当](http://www.dangdang.com/) yueling@dangdang.com
# 交流与参与
- **讨论QQ群:** 532576663(不限于Sharding-JDBC,包括分布式,数据库相关以及其他互联网技术交流。由于QQ群已接近饱和,我们希望您在申请加群之前仔细阅读文档,并在加群申请中正确回答问题,以及在申请时写上您的姓名和公司名称。并且在入群后及时修改群名片。否则我们将有权拒绝您的入群申请。谢谢合作。)
- **邮件组 sharding_jdbc@groups.163.com** ,如果在使用上需要帮助,或者疑似的bug,请发邮件到该邮件组中。发邮件之前请先阅读[FAQ](http://dangdangdotcom.github.io/sharding-jdbc/post/faq/)。
- 报告确定的bug,提交增强功能建议和提交补丁等,请阅读[如何进行贡献](CONTRIBUTING.md)。
# 简介
`Sharding-JDBC`直接封装`JDBC API`,可以理解为增强版的`JDBC`驱动,旧代码迁移成本几乎为零:
* 可适用于任何基于`java`的`ORM`框架,如:`JPA`, `Hibernate`, `Mybatis`, `Spring JDBC Template`或直接使用`JDBC`。
* 可基于任何第三方的数据库连接池,如:`DBCP`, `C3P0`, `BoneCP`, `Druid`等。
* 理论上可支持任意实现`JDBC`规范的数据库。虽然目前仅支持`MySQL`,但已有支持`Oracle`,`SQLServer`,`DB2`等数据库的计划。
`Sharding-JDBC`定位为轻量级`java`框架,使用客户端直连数据库,以`jar`包形式提供服务,未使用中间层,无需额外部署,无其他依赖,`DBA`也无需改变原有的运维方式。`SQL`解析使用`Druid`解析器,是目前性能最高的`SQL`解析器。
`Sharding-JDBC`功能灵活且全面:
* 分片策略灵活,可支持`=`,`BETWEEN`,`IN`等多维度分片,也可支持多分片键共用。
* `SQL`解析功能完善,支持聚合,分组,排序,`Limit`,`OR`等查询,并且支持`Binding Table`以及笛卡尔积的表查询。
* 支持柔性事务(目前仅最大努力送达型)。
* 支持读写分离。
* 支持分布式生成全局主键。
`Sharding-JDBC`配置多样:
* 可支持YAML和Spring命名空间配置
* 灵活多样的`inline`方式
***
以下是常见的分库分表产品和`Sharding-JDBC`的对比:
| 功能 | Cobar | Cobar-client | TDDL | Sharding-JDBC |
| ------------- |:-------------:| -------------:| -----------:|---------------:|
| 分库 | 有 | 有 | 未开源 | 有 |
| 分表 | 无 | 无 | 未开源 | 有 |
| 中间层 | 是 | 否 | 否 | 否 |
| ORM支持 | 任意 | 仅MyBatis | 任意 | 任意 |
| 数据库支持 | 仅MySQL | 任意 | 任意 | 任意 |
| 异构语言 | 可 | 仅Java | 仅Java | 仅Java |
| 外部依赖 | 无 | 无 | Diamond | 无 |
***
# 整体架构图
![整体架构图](http://dangdangdotcom.github.io/sharding-jdbc/img/architecture.png)
![柔性事务-最大努力送达型](http://dangdangdotcom.github.io/sharding-jdbc/img/architecture-soft-transaction-bed.png)
# 相关文档
[FAQ](http://dangdangdotcom.github.io/sharding-jdbc/post/faq/)
[Release Notes](http://dangdangdotcom.github.io/sharding-jdbc/post/release_notes/)
[使用指南](http://dangdangdotcom.github.io/sharding-jdbc/post/user_guide/)
[详细功能列表](http://dangdangdotcom.github.io/sharding-jdbc/post/features/)
[核心概念](http://dangdangdotcom.github.io/sharding-jdbc/post/concepts/)
[架构图](http://dangdangdotcom.github.io/sharding-jdbc/post/architecture/)
[Yaml文件和Spring命名空间配置](http://dangdangdotcom.github.io/sharding-jdbc/post/configuration/)
[基于暗示(Hint)的分片键值注册方法](http://dangdangdotcom.github.io/sharding-jdbc/post/hint_sharding_value/)
[读写分离](http://dangdangdotcom.github.io/sharding-jdbc/post/master_slave)
[柔性事务](http://dangdangdotcom.github.io/sharding-jdbc/post/soft_transaction)
[目录结构说明](http://dangdangdotcom.github.io/sharding-jdbc/post/directory_structure)
[阅读源码编译问题说明](http://dangdangdotcom.github.io/elastic-job/post/source_code_guide)
[使用限制](http://dangdangdotcom.github.io/sharding-jdbc/post/limitations/)
[SQL支持详细列表](http://dangdangdotcom.github.io/sharding-jdbc/post/sql_supported/)
[压力测试报告](http://dangdangdotcom.github.io/sharding-jdbc/post/stress_test/)
[未来线路规划](http://dangdangdotcom.github.io/sharding-jdbc/post/roadmap/)
[事务支持说明](http://dangdangdotcom.github.io/sharding-jdbc/post/transaction/)
[InfoQ新闻](http://www.infoq.com/cn/news/2016/01/sharding-jdbc-dangdang)
[CSDN文章](http://geek.csdn.net/news/detail/55513)
# Quick Start
## 引入maven依赖
```xml
com.dangdang
sharding-jdbc-core
${latest.release.version}
```
## 规则配置
`Sharding-JDBC`的分库分表通过规则配置描述,请简单浏览配置全貌:
```java
ShardingRule shardingRule = ShardingRule.builder()
.dataSourceRule(dataSourceRule)
.tableRules(tableRuleList)
.databaseShardingStrategy(new DatabaseShardingStrategy("sharding_column", new XXXShardingAlgorithm()))
.tableShardingStrategy(new TableShardingStrategy("sharding_column", new XXXShardingAlgorithm())))
.build();
```
规则配置包括数据源配置、表规则配置、分库策略和分表策略组成。这只是最简单的配置方式,实际使用可更加灵活,如:多分片键,分片策略直接和`tableRule`绑定等。
>详细的规则配置请参考[用户指南](http://dangdangdotcom.github.io/sharding-jdbc/post/user_guide/)
## 使用原生JDBC接口
通过`ShardingDataSourceFactory`工厂和规则配置对象获取`ShardingDataSource`,`ShardingDataSource`实现自`JDBC`的标准接口`DataSource`。然后可通过`DataSource`选择使用原生`JDBC`开发,或者使用`JPA`, `MyBatis`等`ORM`工具。
以`JDBC`原生实现为例:
```java
DataSource dataSource = ShardingDataSourceFactory.createDataSource(shardingRule);
String sql = "SELECT i.* FROM t_order o JOIN t_order_item i ON o.order_id=i.order_id WHERE o.user_id=? AND o.order_id=?";
try (
Connection conn = dataSource.getConnection();
PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
preparedStatement.setInt(1, 10);
preparedStatement.setInt(2, 1001);
try (ResultSet rs = preparedStatement.executeQuery()) {
while(rs.next()) {
System.out.println(rs.getInt(1));
System.out.println(rs.getInt(2));
}
}
}
```
## 使用Spring命名空间配置
```xml
```