文章目录

  1. 1. sharding-jdbc
  2. 2. 整体架构图
  3. 3. 项目地址
  4. 4. 参考文档
  5. 5. 快速入门
    1. 5.1. 使用Spring Java Config配置
    2. 5.2. 使用Spring命名空间配置

sharding-jdbc

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

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以及笛卡尔积的表查询。
  • 支持柔性事务(目前仅最大努力送达型)。
  • 支持读写分离。

整体架构图

整体架构图

柔性事务-最大努力送达型

项目地址

https://github.com/dangdangdotcom/sharding-jdbc

参考文档

Release Notes

使用指南

详细功能列表

核心概念

架构图

Yaml文件和Spring命名空间配置

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

读写分离

柔性事务

目录结构说明

阅读源码编译问题说明

使用限制

SQL支持详细列表

压力测试报告

事务支持说明

快速入门

使用Spring Java Config配置

@Configuration
@EnableTransactionManagement
@PropertySource(value = {"classpath:config/source.properties"})
public class BeanConfig {

    @Autowired
    private Environment env;

    @Bean(destroyMethod = "close")
    public DataSource dataSource1() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(env.getProperty("source.driverClassName1").trim());
        dataSource.setUrl(env.getProperty("source.url1").trim());
        dataSource.setUsername(env.getProperty("source.username1").trim());
        dataSource.setPassword(env.getProperty("source.password1").trim());
        return dataSource;
    }

    @Bean(destroyMethod = "close")
    public DataSource dataSource2() {
        DruidDataSource dataSource = new DruidDataSource();
        dataSource.setDriverClassName(env.getProperty("source.driverClassName2").trim());
        dataSource.setUrl(env.getProperty("source.url2").trim());
        dataSource.setUsername(env.getProperty("source.username2").trim());
        dataSource.setPassword(env.getProperty("source.password2").trim());    
        return dataSource;
    }

    @Bean
    public DataSource dataSource () {
        // 数据源配置, 数据源名称与真实数据源之间的映射关系
        Map dataSourceMap = new HashMap(2);
        dataSourceMap.put("sharding_db0", dataSource1());
        dataSourceMap.put("sharding_db1", dataSource2());
        // 定义数据源分布规则
        DataSourceRule dataSourceRule = new DataSourceRule(dataSourceMap);

        // 定义表分布规则, 规则可以使用默认的配置, 均匀分表
        TableRule userTableRule = TableRule.builder("t_user").actualTables(Arrays.asList("t_user_0", "t_user_1", "t_user_2", "t_user_3"))
                .dataSourceRule(dataSourceRule).build();
        // 规则配置
        ShardingRule shardingRule = ShardingRule.builder()
                .dataSourceRule(dataSourceRule)
                .tableRules(Arrays.asList(userTableRule))
                .databaseShardingStrategy(new DatabaseShardingStrategy("org_id", new SingleKeyModuloDatabaseShardingAlgorithm()))
                .tableShardingStrategy(new TableShardingStrategy("user_id", new SingleKeyModuloTableShardingAlgorithm()))
                .build();

        DataSource dataSource = ShardingDataSourceFactory.createDataSource(shardingRule);
        return dataSource;
    }

    @Bean
    public JdbcTemplate jdbcTemplate() {
        JdbcTemplate jdbcTemplate = new JdbcTemplate();
        jdbcTemplate.setDataSource(dataSource());
        return jdbcTemplate;
    }
}

使用Spring命名空间配置

<?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">
    <!-- 库数据源 -->
    <bean id="sharding_db0" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 数据库基本信息配置 -->
        <property name="driverClassName" value="${source.driverClassName1}" />
        <property name="url" value="${source.url1}"/>
        <property name="username" value="${source.username1}"/>
        <property name="password" value="${source.password1}"/>
        <!-- 初始化连接大小 -->
        <property name="initialSize" value="${druid.initialSize}"/>
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="${druid.minIdle}"/>
        <!-- 最大并发连接数 -->
        <property name="maxActive" value="${druid.maxActive}"/>
        <!-- 获取连接最大等待时间 -->
        <property name="maxWait" value="${druid.maxWait}"/>
        <!-- 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="${druid.timeBetweenEvictionRunsMillis}"/>
        <!-- 配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="${druid.minEvictableIdleTimeMillis}"/>
        <!-- 用来检测连接是否有效的sql,要求是一个查询语句-->
        <property name="validationQuery" value="${druid.validationQuery}"/>
        <!-- 申请连接时执行validationQuery检测连接是否有效,配置为true会降低性能 -->
        <property name="testOnBorrow" value="${druid.testOnBorrow}"/>
        <!-- 归还连接时执行validationQuery检测连接是否有效,配置为true会降低性能  -->
        <property name="testOnReturn" value="${druid.testOnReturn}"/>
        <!-- 申请连接的时候检测 -->
        <property name="testWhileIdle" value="${druid.testWhileIdle}"/>
        <!-- 打开PSCache,并且指定每个连接上PSCache的大小 -->
          <property name="poolPreparedStatements" value="${druid.poolPreparedStatements}" />
          <property name="maxPoolPreparedStatementPerConnectionSize" value="${druid.maxPoolPreparedStatementPerConnectionSize}" />
        <!-- 监控数据库 -->
        <!--属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有:                 
                    监控统计用的filter: stat
                    日志用的filter: log4j
                       防御SQL注入的filter: wall -->
        <property name="filters" value="${druid.filters}"/>
    </bean>
    <bean id="sharding_db1" class="com.alibaba.druid.pool.DruidDataSource" init-method="init" destroy-method="close">
        <!-- 数据库基本信息配置 -->
        <property name="driverClassName" value="${source.driverClassName2}" />
        <property name="url" value="${source.url2}"/>
        <property name="username" value="${source.username2}"/>
        <property name="password" value="${source.password2}"/>
    </bean>

    <rdb:strategy id="databaseStrategy" sharding-columns="org_id" algorithm-class="com.lianggzone.sharding.jdbc.algorithm.SingleKeyModuloDatabaseShardingAlgorithm"/>
    <rdb:strategy id="tableShardingStrategy" sharding-columns="user_id" algorithm-class="com.lianggzone.sharding.jdbc.algorithm.SingleKeyModuloTableShardingAlgorithm"/>

    <rdb:data-source id="shardingDataSource">
        <!-- 定义数据源分布规则 -->
        <rdb:sharding-rule data-sources="sharding_db0,sharding_db1">
            <!-- 定义表分布规则, 规则可以使用默认的配置, 均匀分表 -->
            <rdb:table-rules>
                <rdb:table-rule logic-table="t_user" actual-tables="t_user_0,t_user_1,t_user_2,t_user_3" database-strategy="databaseStrategy"  table-strategy="tableShardingStrategy"/>
            </rdb:table-rules>
        </rdb:sharding-rule>
    </rdb:data-source>

    <!-- 配置Jdbc模板 -->
    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="shardingDataSource"></property>
    </bean>
</beans>
(完)

微信公众号

文章目录

  1. 1. sharding-jdbc
  2. 2. 整体架构图
  3. 3. 项目地址
  4. 4. 参考文档
  5. 5. 快速入门
    1. 5.1. 使用Spring Java Config配置
    2. 5.2. 使用Spring命名空间配置