您的位置:

ShardingSphere-JDBC

一、ShardingSphere-JDBC简介

ShardingSphere-JDBC是Apache ShardingSphere的其中一个分布式数据库中间件产品,它提供了Java编程语言访问关系型数据库和非关系型数据库的高性能、可扩展性、易管理性、可靠性的解决方案。

ShardingSphere-JDBC支持Sharding、Masterslave和Encrypt三种数据库中间件的治理功能,同时还提供了分布式数据访问的解决方案,例如数据分片、分布式事务等等。

ShardingSphere-JDBC具有以下特点:

  • 高性能:增强了JDBC驱动性能,并支持多数据库负载均衡,数据分片负载均衡等高级负载均衡策略。
  • 易用性:不依赖任何框架,基于JDBC标准进行开发,无需学习和重新编写SQL。
  • 高可扩展性:支持流行的数据库和中间件,并具有良好的扩展性,可应用于多种应用场景。同时支持横向扩展和纵向扩展。
  • 高可靠性:在分布式出现故障时,ShardingSphere提供了可靠的容错和恢复机制,使应用程序可以持续运行。
  • 支持多种技术:支持多种技术,包括MySQL、Oracle、SQL Server、PostgreSQL、H2、MongoDB、Redis等。

二、ShardingSphere-JDBC的使用

1. 添加依赖

通过添加ShardingSphere-JDBC的 Maven 依赖来使用它,需要在pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-core</artifactId>
    <version>5.0.0-alpha</version>
</dependency>

2. 配置数据源

在配置文件中配置数据源相关信息:

# 数据库配置
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/demo_ds?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
spring.datasource.username=root
spring.datasource.password=root

# ShardingSphere配置
spring.shardingsphere.datasource.names=ds0,ds1
 
# ds0配置
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/demo_ds_0?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
 
# ds1配置
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/demo_ds_1?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root

# 表规则配置
spring.shardingsphere.sharding.tables.student.actual-data-nodes=ds0.student,ds1.student

# db分片算法配置
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{id % 2}

# table分片算法配置
spring.shardingsphere.sharding.tables.student.database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.student.database-strategy.inline.algorithm-expression=ds$->{id % 2}

3. 代码示例

下面是一个查询示例:

String sql = "SELECT * FROM student WHERE id=?";
 
try (Connection conn = dataSource.getConnection();
     PreparedStatement preparedStatement = conn.prepareStatement(sql)) {
    preparedStatement.setInt(1, 1);
    try (ResultSet rs = preparedStatement.executeQuery()) {
        while (rs.next()) {
            System.out.println(rs.getLong(1));
        }
    }
}

三、ShardingSphere-JDBC的可扩展性

1. 开发自定义的分片算法

ShardingSphere-JDBC提供了很好的可扩展性,允许开发人员扩展自定义的算法和规则,以满足特殊场景下的需求。

比如,我们可以开发自己的分片算法:

public class MyShardingAlgorithm implements PreciseShardingAlgorithm
    {

    @Override
    public String doSharding(Collection
     availableTargetNames, PreciseShardingValue
      shardingValue) {
        for (String each : availableTargetNames) {
            if (each.endsWith(shardingValue.getValue() % 2 + "")) {
                return each;
            }
        }
        throw new IllegalArgumentException();
    }
}

     
    
   

2. 开发自定义的数据源扩展

ShardingSphere-JDBC的另一个可扩展性是,可以使用自定义的数据源扩展,例如Mybatis、Hibernate等。

我们可以在Spring Boot中配置Mybatis和ShardingSphere-JDBC:

# Mybatis配置
mybatis.mapper-locations=classpath*:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity
 
# ShardingSphere配置
spring.shardingsphere.datasource.names=ds0,ds1
 
# ds0配置
spring.shardingsphere.datasource.ds0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds0.url=jdbc:mysql://localhost:3306/demo_ds_0?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds0.username=root
spring.shardingsphere.datasource.ds0.password=root
 
# ds1配置
spring.shardingsphere.datasource.ds1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.ds1.url=jdbc:mysql://localhost:3306/demo_ds_1?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=GMT%2B8
spring.shardingsphere.datasource.ds1.username=root
spring.shardingsphere.datasource.ds1.password=root

# 表规则配置
spring.shardingsphere.sharding.tables.student.actual-data-nodes=ds0.student,ds1.student

# db分片算法配置
spring.shardingsphere.sharding.default-database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.default-database-strategy.inline.algorithm-expression=ds$->{id % 2}

# table分片算法配置
spring.shardingsphere.sharding.tables.student.database-strategy.inline.sharding-column=id
spring.shardingsphere.sharding.tables.student.database-strategy.inline.algorithm-expression=ds$->{id % 2}

# Mybatis配置
mybatis.mapper-locations=classpath*:mapper/*.xml
mybatis.type-aliases-package=com.example.demo.entity

3. 开发自定义的数据源类型

ShardingSphere-JDBC还允许开发自定义的数据源类型,以支持不同类型的数据库或中间件。

以下是一个自定义的数据源类型的示例:

public class MyDataSource extends AbstractDataSourceAdapter {
 
    public MyDataSource() {
        super(createDataSourceMap());
    }
    
    //创建Mybatis-SQLite数据源
    private static Map<String, DataSource> createDataSourceMap() {
        Map<String, DataSource> result = new HashMap<>();
        result.put("ds0", createSQLiteDataSource());
        return result;
    }
    
    //创建SQLite数据源
    public static DataSource createSQLiteDataSource() {
        SQLiteDataSource result = new SQLiteDataSource();
        result.setUrl("jdbc:sqlite::memory:");
        return result;
    }
}

四、ShardingSphere-JDBC的应用场景

ShardingSphere-JDBC适用于以下场景:

  • 分布式应用:在多台机器上运行相同应用程序时,可以使用ShardingSphere-JDBC提供的分片策略,将业务数据分布在多个节点上,使应用程序可以进行横向扩展和负载均衡。
  • 高性能应用:使用ShardingSphere-JDBC可以达到高并发、低延迟的目标,ShardingSphere-JDBC提供了多数据源负载均衡、分布式事务等高级负载均衡策略,可以支持高性能的应用程序。
  • 多租户系统:使用ShardingSphere-JDBC可以将业务数据按照租户ID进行分片,实现多租户系统,并能够支持横向扩展和负载均衡。

五、总结

ShardingSphere-JDBC是一个非常强大的分布式数据库中间件,它提供了高性能、易用性、高可扩展性、高可靠性的解决方案。同时,它还为开发人员提供了很好的可扩展性,以便于满足特殊场景下的需求。使用ShardingSphere-JDBC可以让我们快速地构建出高性能、可扩展的应用程序。