当当网 / sharding-jdbc

地址:https://git.oschina.net/dangdangdotcom/sharding-jdbc

 

harding-JDBC - A JDBC driver for shard databases and tables

Sharding-JDBC是当当应用框架ddframe中,关系型数据库模块dd-rdb中分离出来的数据库水平扩展框架,即透明化数据库分库分表访问。

Sharding-JDBCdubboxelastic-job之后,是ddframe系列开源的第三个产品。

Release Notes

  • sharding-jdbc           
  • sharding-jdbc-core  
  • sharding-jdbc-config-yaml  
  • sharding-jdbc-config-spring  
  • sharding-jdbc-transaction  
  • sharding-jdbc-transaction-async-job  
  • sharding-jdbc-self-id-generator  

License

Build Status

Build Status

主要贡献者

交流与参与

  • (不限于Sharding-JDBC,包括分布式,数据库相关以及其他互联网技术交流。由于已接近饱和,我们希望您在申请加群之前仔细阅读文档,并在加群申请中正确回答问题,以及在申请时写上您的姓名和公司名称。并且在入群后及时修改群名片。否则我们将有权拒绝您的入群申请。谢谢合作。)
  • 邮件组 [email protected] ,如果在使用上需要帮助,或者疑似的bug,请发邮件到该邮件组中。发邮件之前请先阅读FAQ。
  • 报告确定的bug,提交增强功能建议和提交补丁等,请阅读如何进行贡献。

简介

Sharding-JDBC直接封装JDBC API,可以理解为增强版的JDBC驱动,旧代码迁移成本几乎为零:

  • 可适用于任何基于javaORM框架,如:JPAHibernateMybatisSpring JDBC Template或直接使用JDBC
  • 可基于任何第三方的数据库连接池,如:DBCPC3P0BoneCPDruid等。
  • 理论上可支持任意实现JDBC规范的数据库。虽然目前仅支持MySQL,但已有支持OracleSQLServerDB2等数据库的计划。

Sharding-JDBC定位为轻量级java框架,使用客户端直连数据库,以jar包形式提供服务,未使用中间层,无需额外部署,无其他依赖,DBA也无需改变原有的运维方式。SQL解析使用Druid解析器,是目前性能最高的SQL解析器。

Sharding-JDBC功能灵活且全面:

  • 分片策略灵活,可支持=BETWEENIN等多维度分片,也可支持多分片键共用。
  • SQL解析功能完善,支持聚合,分组,排序,LimitOR等查询,并且支持Binding Table以及笛卡尔积的表查询。
  • 支持柔性事务(目前仅最大努力送达型)。
  • 支持读写分离。
  • 支持分布式生成全局主键。

Sharding-JDBC配置多样:

  • 可支持YAML和Spring命名空间配置
  • 灵活多样的inline方式

以下是常见的分库分表产品和Sharding-JDBC的对比:

功能 Cobar Cobar-client TDDL Sharding-JDBC
分库 未开源
分表 未开源
中间层
ORM支持 任意 仅MyBatis 任意 任意
数据库支持 仅MySQL 任意 任意 任意
异构语言 仅Java 仅Java 仅Java
外部依赖 Diamond

整体架构图

相关文档

FAQ

Release Notes

使用指南

详细功能列表

核心概念

架构图

Yaml文件和Spring命名空间配置

基于暗示(Hint)的分片键值注册方法

读写分离

柔性事务

Id生成器

目录结构说明

阅读源码编译问题说明

使用限制

SQL支持详细列表

压力测试报告

未来线路规划

事务支持说明

InfoQ新闻

CSDN文章

Quick Start

引入maven依赖



    com.dangdang
    sharding-jdbc-core
    ${latest.release.version}

规则配置

Sharding-JDBC的分库分表通过规则配置描述,请简单浏览配置全貌:

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工厂和规则配置对象获取ShardingDataSourceShardingDataSource实现自JDBC的标准接口DataSource。然后可通过DataSource选择使用原生JDBC开发,或者使用JPAMyBatisORM工具。
JDBC原生实现为例:

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命名空间配置


 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 
                        ">
     location="classpath:conf/rdb/conf.properties" ignore-unresolvable="true"/>

     id="dbtbl_0" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
         name="driverClassName" value="com.mysql.jdbc.Driver"/>
         name="url" value="jdbc:mysql://localhost:3306/dbtbl_0"/>
         name="username" value="root"/>
         name="password" value=""/>
    
     id="dbtbl_1" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
         name="driverClassName" value="com.mysql.jdbc.Driver"/>
         name="url" value="jdbc:mysql://localhost:3306/dbtbl_1"/>
         name="username" value="root"/>
         name="password" value=""/>
    

     id="orderTableStrategy" sharding-columns="order_id" algorithm-expression="t_order_${order_id.longValue() % 4}"/>
     id="orderItemTableStrategy" sharding-columns="order_id" algorithm-expression="t_order_item_${order_id.longValue() % 4}"/>
     id="shardingDataSource">
         data-sources="dbtbl_0,dbtbl_1">
            
                 logic-table="t_order" actual-tables="t_order_${0..3}" table-strategy="orderTableStrategy"/>
                 logic-table="t_order_item" actual-tables="t_order_item_${0..3}" table-strategy="orderItemTableStrategy"/>
            
             sharding-columns="none" algorithm-class="com.dangdang.ddframe.rdb.sharding.api.strategy.database.NoneDatabaseShardingAlgorithm"/>
        
    

你可能感兴趣的:(当当网 / sharding-jdbc)