sharding-jdbc - 透明化數據庫分庫分表訪問
Sharding-JDBC
是當當應用框架ddframe
中,關系型數據庫模塊dd-rdb
中分離出來的數據庫水平擴展框架,即透明化數據庫分庫分表訪問。
Sharding-JDBC
繼dubbox
和elastic-job
之后,是ddframe
系列開源的第三個產品。
主要貢獻者
- 張亮 當當 zhangliang@dangdang.com
- 高洪濤 當當 gaohongtao@dangdang.com
- 曹昊 當當 caohao@dangdang.com
- 岳令 當當 yueling@dangdang.com
討論QQ群:532576663(不限于Sharding-JDBC,包括分布式,數據庫相關以及其他互聯網技術交流)
簡介
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
的對比:
功能 | Cobar | Cobar-client | TDDL | Sharding-JDBC |
---|---|---|---|---|
分庫 | 有 | 有 | 未開源 | 有 |
分表 | 無 | 無 | 未開源 | 有 |
中間層 | 是 | 否 | 否 | 否 |
ORM支持 | 任意 | 僅MyBatis | 任意 | 任意 |
數據庫支持 | 僅MySQL | 任意 | 任意 | 任意 |
異構語言 | 可 | 僅Java | 僅Java | 僅Java |
外部依賴 | 無 | 無 | Diamond | 無 |
整體架構圖
相關文檔
Quick Start
引入maven依賴(暫時還未放入中央倉庫,等穩定后再部署)
<!-- 引入sharding-jdbc核心模塊 -->
<dependency>
<groupId>com.dangdang</groupId>
<artifactId>sharding-jdbc-core</artifactId>
<version>1.0.0</version>
</dependency>
規則配置
Sharding-JDBC
的分庫分表通過規則配置描述,請簡單瀏覽配置全貌:
ShardingRule shardingRule = new ShardingRule(
dataSourceRule,
Arrays.asList(tableRule),
new DatabaseShardingStrategy("sharding_column_1", new XXXShardingAlgorithm()),
new TableShardingStrategy("sharding_column_2", new XXXShardingAlgorithm()));
規則配置包括數據源配置、表規則配置、分庫策略和分表策略組成。這只是最簡單的配置方式,實際使用可更加靈活,如:多分片鍵,分片策略直接和tableRule
綁定等。
詳細的規則配置請參考用戶指南
使用基于ShardingDataSource的JDBC接口
通過規則配置對象獲取ShardingDataSource
,ShardingDataSource
實現自JDBC
的標準接口DataSource
。然后可通過DataSource
選擇使用原生JDBC
開發,或者使用JPA
, MyBatis
等ORM
工具。 以JDBC
原生實現為例:
DataSource dataSource = new ShardingDataSource(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 pstmt = conn.prepareStatement(sql)) {
pstmt.setInt(1, 10);
pstmt.setInt(2, 1001);
try (ResultSet rs = pstmt.executeQuery()) {
while(rs.next()) {
System.out.println(rs.getInt(1));
System.out.println(rs.getInt(2));
System.out.println(rs.getInt(3));
}
}
}
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!