Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
apache
Shardingsphere
提交
01050c24
Shardingsphere
项目概览
apache
/
Shardingsphere
通知
56
Star
3
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
DevOps
流水线
流水线任务
计划
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
Shardingsphere
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
DevOps
DevOps
流水线
流水线任务
计划
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
流水线任务
提交
Issue看板
体验新版 GitCode,发现更多精彩内容 >>
提交
01050c24
编写于
4月 13, 2017
作者:
H
haocao
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
For #197: initial version for 00-overview chapter.
上级
d5da3bab
变更
4
隐藏空白更改
内联
并排
Showing
4 changed file
with
392 addition
and
4 deletion
+392
-4
sharding-jdbc-doc/content/00-overview/contribution.md
sharding-jdbc-doc/content/00-overview/contribution.md
+175
-0
sharding-jdbc-doc/content/00-overview/index.md
sharding-jdbc-doc/content/00-overview/index.md
+68
-0
sharding-jdbc-doc/content/00-overview/intro.md
sharding-jdbc-doc/content/00-overview/intro.md
+144
-0
sharding-jdbc-doc/content/00-overview/release-notes.md
sharding-jdbc-doc/content/00-overview/release-notes.md
+5
-4
未找到文件。
sharding-jdbc-doc/content/00-overview/contribution.md
0 → 100644
浏览文件 @
01050c24
# 如何成为贡献者?
您可以报告bug,提交一个新的功能增强建议或者直接对以上内容提交改进补丁。
## 报告bug
本章节介绍如何提交一个bug。
### 报告一个新bug之前
-
确定在最新版本中该bug存在。我们将不会持续维护所有的发布版本,所有的修改仅根据当前版本。
-
确认该bug是可以复现的。请尽量提供完整的重现步骤。
-
请确定这不是一个重复的bug。
查看
[
Issue Page
](
https://github.com/dangdangdotcom/sharding-jdbc/issues
)
列表,搜索您要提交的bug是否已经被报告过。
### 如何提交一个有质量的bug
请在
[
Issue Page
](
https://github.com/dangdangdotcom/sharding-jdbc/issues
)
页面中提交bug。
-
使用一个清晰并有描述性的标题来定义bug。
-
详细的描述复现bug的步骤。包括您使用的SQL,配置情况,预计产生的结果,实际产生的结果。并附加详细的TRACE日志。
-
如果程序抛出异常,请附加完整的堆栈日志。
-
如有可能,请附上屏幕截图或动态的GIF图,这些图片能帮助演示整个问题的产生过程。
-
如果涉及性能问题,请附加上CPU,内存或网络磁盘IO的Profile截图。
-
说明适用的版本,只有release版本的bug才可以提交,并且应该是当前最新版本。
-
说明适用的操作系统,及其版本。
-
使用bug标签(Label)来标记这个issue。
以下是bug的Markdown模板,请按照该模板填写issue。
```
[问题简单描述]
**问题复现步骤:**
1. [第一步]
2. [第二步]
3. [其他步骤...]
**期望的表现:**
[在这里描述期望的表现]
**观察到的表现:**
[在这里描述观察到的表现]
**屏幕截图和动态GIF图**
![复现步骤的屏幕截图和动态GIF图](图片的url)
**Sharding-JDBC版本:** [输入Sharding-JDBC的版本]
**操作系统及版本:** [输入操作系统及版本]
```
## 提交功能增强建议
本章节介绍如何提交一个功能增强建议。
### 提交一个功能增强建议之前
-
请先检查
[
详细功能列表
](
http://dangdangdotcom.github.io/sharding-jdbc/post/features/
)
。
-
请确定这不是一个重复的功能增强建议。
查看
[
Issue Page
](
https://github.com/dangdangdotcom/sharding-jdbc/issues
)
列表,搜索您要提交的功能增强建议是否已经被提交过。
### 如何提交一个好的功能增强建议
请在
[
Issue Page
](
https://github.com/dangdangdotcom/sharding-jdbc/issues
)
页面中提交功能增强建议。
-
使用一个清晰并有描述性的标题来定义增强建议。
-
详细描述增强功能的行为模式。
-
解释说明为什么该功能是对大多数用户是有用的。新功能应该具有广泛的适用性。
-
如有可能,可以列出其他数据库中间已经具备的类似功能。商用与开源软件均可。
-
使用enhancement标签(Label)来标记这个issue。
以下是功能增强建议的Markdown模板,请按照该模板填写issue。
```
[简单的建议描述]
**建议的新功能行为**
[描述新功能应表现的行为模式]
**为什么这个新功能是对大多数用户有用的**
[解释这个功能为什么对大多数用户是有用的]
[列出其他的数据库中间件是否包含该功能,且如何实现的]
```
## 贡献补丁(patch)
本文档帮助贡献者搭建开发环境并贡献代码,示例和文档。
### 编译代码
Sharding-JDBC的代码编译需要
[
Maven
](
http://maven.apache.org/
)
,请保证IDE中正确配置了它。
代码用到的所有依赖完全都可以从公网下载,请根据自身的网络情况选择合理的镜像。
代码使用了
[
Lombok
](
https://projectlombok.org/download.html
)
来生成类属性的访问方法,构造器等。
故请以上从链接内容来获取适合您的IDE的解决方法。
### 文档生成
文档使用博客生成引擎
[
HUGO
](
https://gohugo.io/
)
,请根据文档安装环境。
文档全部在sharding-jdbc/sharding-jdbc-doc/content/post目录中。
### 贡献方法
请按照下面的步骤贡献代码,示例和文档。
-
所有的问题与新功能请使用
[
Issue Page
](
https://github.com/dangdangdotcom/sharding-jdbc/issues
)
进行管理。
-
任何人想要开发任何功能,请先回复该功能所关联的Issue,表明您当前正在这个Issue上工作。
并在回复的时候为自己设置一个deadline,并添加的回复内容中。
-
在核心贡献者找到一个导师(shepherd),导师会在设计与功能实现上给予即时的反馈。
如果您没有熟悉的架构师,请向__sharding_jdbc@groups.163.com__发送邮件。
-
您应该新建一个分支来开始您的工作,分支的名字为功能名称/issueId。
例如,您想完成一个SQL解析(parser)功能中 __Issue 111__,那么您的branch名字应为 __parser/111__。
功能名称与导师讨论后确定。
-
完成后,发送一个pull request到dangdangdotcom/sharding-jdbc,
接着导师做CodeReview,然后他会与您讨论一些细节(包括设计,实现,性能等)。当团队中所有人员对本次修改满意后,导师会将提交合并到master分支。
-
最后,恭喜您已经成为了Sharding-JDBC的官方贡献者!
### 开发理念
-
用心写代码,提炼真正的非功能性需求。
-
代码整洁干净到极致, 请参见《重构》和《代码整洁之道》。
-
极简代码, 高度复用,无重复代码和配置。
-
代码应在同一抽象层级。
-
修改功能时多考虑影响面, 不可留下没修改完全的部分。
-
只有一个需求时,不需扩展性。两个类似需求时, 再提炼扩展性。
### 开发行为规范
-
提交之前先确定模块的测试套件,并使用测试覆盖率工具检查覆盖率不能低于master分支的覆盖率。
-
使用Checkstyle检查代码, 违反验证规则的需要有特殊理由。模板位置在sharding-jdbc/src/resources/dd_checks.xml。
-
执行mvn clean install可以测试和编译通过。
-
及时删除无用代码。
### 编码规范
-
写代码之前看一下系统已有的代码, 保持风格和使用方式一致。
-
变量命名要有意义, 如果方法只有唯一的返回值, 使用result命名返回值. 循环中使用each命名循环变量, map中使用entry代替each。
-
嵌套循环尽量提成方法。
-
优先使用卫语句。
-
配置文件使用驼峰命名, 文件名首字母小写。
-
类和方法的访问权限控制为最小, 例如: 可以设为包私有的就不用public。
-
方法所用到的私有方法应紧跟着该方法, 如果有多个私有方法, 书写私有方法应与私有方法在原方法的出现顺序相同。
-
优先使用guava而非apache commons, 如:优先使用Strings而非StringUtils。
-
优先使用lombok代替构造器, get, set, log方法。
-
使用linux换行符。
-
缩进(包含空行)和上一行保持一致。
-
不应有无意义的空行。
-
方法入参和返回值不允许为null,如有特殊情况需注释说明。
-
需要注释解释的代码尽量提成小方法,用方法名称解释,注释应只包含javadoc和todo,fixme等。
-
禁止使用static import。
-
不需要公开的类放入internal包,包中类尽量包私有。
-
日志一律使用英文。
-
使用annotation获取spring的业务bean。
-
如果模块中有公用的切入点,应在模块一级路径创建pointcut包。
-
属性配置项需要添加到各个模块的常量枚举中。
### 单元测试规范
-
测试代码和生产代码需遵守相同代码规范。
-
如无特殊理由, 测试需全覆盖。
-
准备环境的代码和测试代码分离。
-
单数据断言, 应使用assertTrue, assertFalse, assertNull, assertNotNull。
-
多数据断言, 应使用assertThat。
-
精确断言, 尽量不使用not, containsString断言。
-
调用业务方法的变量, 应命名为actualXXX, 期望值应命名为expectedXXX。
-
只有junit assertXXX, hamcrest, mocktio相关可以使用static import。
\ No newline at end of file
sharding-jdbc-doc/content/00-overview/index.md
0 → 100644
浏览文件 @
01050c24
+++
icon = "
<b>
0.
</b>
"
date = "2017-04-12T16:06:17+08:00"
title = "概览"
weight = 0
prev = "/03-develop/roadmap"
next = "/00-overview/intro"
chapter = true
+++
# 概述
Sharding-JDBC是当当应用框架ddframe中,关系型数据库模块dd-rdb中分离出来的数据库水平扩展框架,即透明化数据库分库分表访问。Sharding-JDBC继dubbox和Elastic-Job之后,是ddframe系列开源的第三个产品。
Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式,可理解为增强版的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)
[
![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)
[
![GitHub release
](
https://img.shields.io/github/release/dangdangdotcom/sharding-jdbc.svg
)
](https://github.com/dangdangdotcom/sharding-jdbc/releases)
[
![Hex.pm
](
http://dangdangdotcom.github.io/elastic-job/img/license.svg
)
](http://www.apache.org/licenses/LICENSE-2.0.html)
# 功能列表
## 1. 分库分表
*
SQL解析功能完善,支持聚合,分组,排序,LIMIT,OR等查询,并且支持级联表以及笛卡尔积的表查询
*
支持内、外连接查询
*
分片策略灵活,可支持=,BETWEEN,IN等多维度分片,也可支持多分片键共用,以及自定义分片策略
*
基于Hint的强制分库分表路由
## 2. 读写分离
*
一主多从的读写分离配置,可配合分库分表使用
*
基于Hint的强制主库路由
## 3. 分布式事务
*
最大努力送达型事务
*
TCC型事务(TBD)
## 4. 兼容性
*
可适用于任何基于java的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC
*
可基于任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid等
*
理论上可支持任意实现JDBC规范的数据库。虽然目前仅支持MySQL,但已有支持Oracle,SQLServer,DB2等数据库的计划
## 5. 灵活多样的配置
*
Java
*
Spring命名空间
*
YAML
*
Inline表达式
## 6. 分布式生成全局主键
*
统一的分布式基于时间序列的ID生成器
# 第三方文档
*
2017-03
[
开源中国高手问答:高手问答第144期—轻量级数据库中间层 Sharding-JDBC 深度解析
](
https://www.oschina.net/question/2720166_2233456
)
*
2016-06
[
InfoQ文章:Sharding-JDBC 1.3.0发布——支持读写分离
](
http://www.infoq.com/cn/news/2016/06/sharding-jdbc-130
)
*
2016-02
[
CSDN文章:解读分库分表中间件Sharding-JDBC
](
http://geek.csdn.net/news/detail/55513
)
*
2016-01
[
InfoQ新闻:当当开源sharding-jdbc,轻量级数据库分库分表中间件
](
http://www.infoq.com/cn/news/2016/01/sharding-jdbc-dangdang
)
# 交流与参与
-
**讨论QQ群:**
532576663(不限于Sharding-JDBC,包括分布式,数据库相关以及其他互联网技术交流。由于QQ群已接近饱和,我们希望您在申请加群之前仔细阅读文档,并在加群申请中正确回答问题,以及在申请时写上您的姓名和公司名称。并且在入群后及时修改群名片。否则我们将有权拒绝您的入群申请。谢谢合作。)
-
**邮件组 sharding_jdbc@groups.163.com**
,如果在使用上需要帮助,或者疑似的bug,请发邮件到该邮件组中。发邮件之前请先阅读
[
FAQ
](
/01-start/faq
)
。
-
报告确定的bug,提交增强功能建议和提交补丁等,请阅读
[
如何进行贡献
](
/00-overview/contribution
)
。
**使用Sharding-JDBC的公司如果方便请留下公司+网址**
https://github.com/dangdangdotcom/sharding-jdbc/issues/234
# 采用公司(统计中)
sharding-jdbc-doc/content/00-overview/intro.md
0 → 100644
浏览文件 @
01050c24
+++
toc = true
date = "2016-12-06T22:38:50+08:00"
title = "简介"
weight = 1
prev = "/00-overview"
next = "/00-overview/release-notes"
+++
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
)
# 快速入门
## 引入maven依赖
```
xml
<!-- 引入sharding-jdbc核心模块 -->
<dependency>
<groupId>
com.dangdang
</groupId>
<artifactId>
sharding-jdbc-core
</artifactId>
<version>
${latest.release.version}
</version>
</dependency>
```
## 规则配置
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绑定等。
## 使用原生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
<?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:context=
"http://www.springframework.org/schema/context"
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.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd
http://www.dangdang.com/schema/ddframe/rdb
http://www.dangdang.com/schema/ddframe/rdb/rdb.xsd
"
>
<context:property-placeholder
location=
"classpath:conf/rdb/conf.properties"
ignore-unresolvable=
"true"
/>
<bean
id=
"dbtbl_0"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method=
"close"
>
<property
name=
"driverClassName"
value=
"com.mysql.jdbc.Driver"
/>
<property
name=
"url"
value=
"jdbc:mysql://localhost:3306/dbtbl_0"
/>
<property
name=
"username"
value=
"root"
/>
<property
name=
"password"
value=
""
/>
</bean>
<bean
id=
"dbtbl_1"
class=
"org.apache.commons.dbcp.BasicDataSource"
destroy-method=
"close"
>
<property
name=
"driverClassName"
value=
"com.mysql.jdbc.Driver"
/>
<property
name=
"url"
value=
"jdbc:mysql://localhost:3306/dbtbl_1"
/>
<property
name=
"username"
value=
"root"
/>
<property
name=
"password"
value=
""
/>
</bean>
<rdb:strategy
id=
"orderTableStrategy"
sharding-columns=
"order_id"
algorithm-expression=
"t_order_${order_id.longValue() % 4}"
/>
<rdb:strategy
id=
"orderItemTableStrategy"
sharding-columns=
"order_id"
algorithm-expression=
"t_order_item_${order_id.longValue() % 4}"
/>
<rdb:data-source
id=
"shardingDataSource"
>
<rdb:sharding-rule
data-sources=
"dbtbl_0,dbtbl_1"
>
<rdb:table-rules>
<rdb:table-rule
logic-table=
"t_order"
actual-tables=
"t_order_${0..3}"
table-strategy=
"orderTableStrategy"
/>
<rdb:table-rule
logic-table=
"t_order_item"
actual-tables=
"t_order_item_${0..3}"
table-strategy=
"orderItemTableStrategy"
/>
</rdb:table-rules>
<rdb:default-database-strategy
sharding-columns=
"none"
algorithm-class=
"com.dangdang.ddframe.rdb.sharding.api.strategy.database.NoneDatabaseShardingAlgorithm"
/>
</rdb:sharding-rule>
</rdb:data-source>
</beans>
```
sharding-jdbc-doc/content/0
3-community
/release-notes.md
→
sharding-jdbc-doc/content/0
0-overview
/release-notes.md
浏览文件 @
01050c24
...
...
@@ -3,10 +3,11 @@ toc = true
date = "2016-12-06T22:38:50+08:00"
title = "Release Note"
weight = 2
prev = "/0
3-community/architecture
"
next = "/0
3-community/directory-structure
"
prev = "/0
0-overview/intro
"
next = "/0
1-start/index
"
+++
## 1.4.2
### 功能提升
...
...
@@ -177,7 +178,7 @@ next = "/03-community/directory-structure"
1.
[
ISSUE #16
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/16
)
改造多线程执行模型
1.
[
ISSUE #18
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/18
)
查询Count时,使用getObject()取数会报异常
1.
[
ISSUE #19
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/19
)
sum和avg函数,不加别名不执行merger,加了空指针异常
1.
[
ISSUE #38
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/38
)
JPA与Sharding-JDBC的兼容问题。JPA会自动增加SELECT的列别名,导致ORDER BY只能通过别名,而非列名称获取ResultSet的数据
。
1.
[
ISSUE #38
](
https://github.com/dangdangdotcom/sharding-jdbc/issues/38
)
JPA与Sharding-JDBC的兼容问题。JPA会自动增加SELECT的列别名,导致ORDER BY只能通过别名,而非列名称获取ResultSet的数据
## 1.0.0
1.
初始版本
。
1.
初始版本
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录