sharding-jdbc - 透明化數據庫分庫分表訪問

jopen 8年前發布 | 86K 次閱讀 JDBC Java開發 Sharding-JDBC

Sharding-JDBC是當當應用框架ddframe中,關系型數據庫模塊dd-rdb中分離出來的數據庫水平擴展框架,即透明化數據庫分庫分表訪問。

Sharding-JDBCdubboxelastic-job之后,是ddframe系列開源的第三個產品。

主要貢獻者

討論QQ群:532576663(不限于Sharding-JDBC,包括分布式,數據庫相關以及其他互聯網技術交流)

簡介

Sharding-JDBC直接封裝JDBC API,可以理解為增強版的JDBC驅動,舊代碼遷移成本幾乎為零:

  • 可適用于任何基于javaORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC
  • 可基于任何第三方的數據庫連接池,如:DBCP, C3P0, BoneCP, Druid等。
  • 理論上可支持任意實現JDBC規范的數據庫。雖然目前僅支持MySQL,但已有支持OracleSQLServerDB2等數據庫的計劃。

Sharding-JDBC定位為輕量級java框架,使用客戶端直連數據庫,以jar包形式提供服務,未使用中間層,無需額外部署,無其他依賴,DBA也無需改變原有的運維方式。SQL解析使用Druid解析器,是目前性能最高的SQL解析器。

Sharding-JDBC功能靈活且全面:

  • 分片策略靈活,可支持=BETWEENIN等多維度分片,也可支持多分片鍵共用。
  • SQL解析功能完善,支持聚合,分組,排序,LimitOR等查詢,并且支持Binding Table以及笛卡爾積的表查詢。

以下是常見的分庫分表產品和Sharding-JDBC的對比:

功能 Cobar Cobar-client TDDL Sharding-JDBC
分庫 未開源
分表 未開源
中間層
ORM支持 任意 僅MyBatis 任意 任意
數據庫支持 僅MySQL 任意 任意 任意
異構語言 僅Java 僅Java 僅Java
外部依賴 Diamond

整體架構圖

687474703a2f2f64616e6764616e67646f74636f6d2e6769746875622e696f2f7368617264696e672d6a6462632f696d672f6172636869746563747572652e706e67.png

相關文檔

使用指南

詳細功能列表

架構圖

使用限制

未來線路規劃

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接口

通過規則配置對象獲取ShardingDataSourceShardingDataSource實現自JDBC的標準接口DataSource。然后可通過DataSource選擇使用原生JDBC開發,或者使用JPA, MyBatisORM工具。 以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));
        }
    }
}

項目地址: https://github.com/dangdangdotcom/sharding-jdbc

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