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 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!
