Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

david1228/sharding-jdbc

Repository files navigation

Sharding-JDBC - JDBC driver for shard databases and tables

Build Status Maven Status Coverage Status GitHub release Hex.pm

Overview

Sharding-JDBC is a JDBC extension, provides distributed features such as sharding, read/write splitting and BASE transaction.

Features

1. Sharding

  • Aggregation functions, group by, order by and limit SQL supported in distributed database.
  • Join (inner/outer) query supported.
  • Sharding operator =, BETWEEN and IN supported.
  • Sharding algorithm customization supported.
  • Hint supported.

2. Read/Write Splitting

  • Same transaction data concurrency guarantee.
  • Hint supported.

3. BASE Transaction

  • Best efforts delivery transaction.
  • Try confirm cancel transaction (TBD).

4. Compatibility

  • ORM self-adapting. JPA, Hibernate, Mybatis, Spring JDBC Template or JDBC supported.
  • Connection-pool self-adapting. DBCP, C3P0, BoneCP, Druid supported.
  • Any Database supported theoretically. MySQL support only, will support Oracle, SQLServer, DB2 and PostgreSQL in future.

5. Configuration

  • Java config
  • Spring namespace
  • YAML
  • Inline expression

6. ID Generation

  • Distributed Unique Time-Sequence Generation

Architecture

Architecture

Quick Start

Add maven dependency

<!-- import sharding-jdbc core -->
<dependency>
 <groupId>com.dangdang</groupId>
 <artifactId>sharding-jdbc-core</artifactId>
 <version>${latest.release.version}</version>
</dependency>
<!-- import other module if need -->

Rule configuration

ShardingRule shardingRule = ShardingRule.builder()
 .dataSourceRule(dataSourceRule)
 .tableRules(tableRuleList)
 .databaseShardingStrategy(new DatabaseShardingStrategy("sharding_column", new XXXShardingAlgorithm()))
 .tableShardingStrategy(new TableShardingStrategy("sharding_column", new XXXShardingAlgorithm())))
 .build();

Use raw JDBC API

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));
 }
 }
}

Use spring namespace

<?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>

About

A JDBC driver for shard databases and tables

Resources

License

Stars

Watchers

Forks

Packages

No packages published

Languages

  • Java 95.3%
  • CSS 2.3%
  • HTML 1.2%
  • JavaScript 1.1%
  • Shell 0.1%

AltStyle によって変換されたページ (->オリジナル) /