Sharding-JDBC 数据源分片:Yaml 配置实现基于原生 JDBC 的精确分片方案

本文介绍 Sharding-JDBC 数据源分片之使用 Yaml 配置实现基于原生 JDBC 的精确分片方案。

注意:请先阅读 【Sharding-JDBC 数据源分片:Java 配置实现基于原生 JDBC 的精确分片方案】,本文示例代码在此基础上增量添加。


目录

  • 开发环境
  • 基础示例
  • 总结

开发环境

  • Oracle JDK 1.8.0_201
  • Apache Maven 3.6.0
  • IntelliJ IDEA (Version 2018.3.3)
  • MySQL 5.6.38

基础示例

  1. resources 目录下新建 META-INF/sharding-databases.yaml 配置文件。
dataSources:
  ds_0: !!com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/ds_0?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
  ds_1: !!com.alibaba.druid.pool.DruidDataSource
    url: jdbc:mysql://localhost:3306/ds_1?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    username: root
    password: 123456
shardingRule:
  tables:
    t_order:
      # 数据节点
      actualDataNodes: ds_${0..1}.t_order
      keyGenerator:
        type: SNOWFLAKE
        column: order_id
  defaultDatabaseStrategy:
    inline:
      # 分片键
      shardingColumn: user_id
      # 行表达式
      algorithmExpression: ds_${user_id % 2}
  1. 定义获取数据源的工厂类。
package tutorial.shardingsphere.jdbc.util;

import org.apache.shardingsphere.shardingjdbc.api.yaml.YamlShardingDataSourceFactory;

import javax.sql.DataSource;
import java.io.File;
import java.io.IOException;
import java.sql.SQLException;

public class YamlDataSourceFactory {

    public static DataSource getDataSource() throws SQLException, IOException {
        return YamlShardingDataSourceFactory.createDataSource(
                getFile("/META-INF/sharding-databases.yaml"));
    }

    private static File getFile(final String fileName) {
        return new File(Thread.currentThread().getClass().getResource(fileName).getFile());
    }
}
  1. 编写单元测试。
package tutorial.shardingsphere.jdbc;

import org.junit.Assert;
import org.junit.BeforeClass;
import org.junit.Test;
import tutorial.shardingsphere.jdbc.bean.Order;
import tutorial.shardingsphere.jdbc.dao.IOrderDao;
import tutorial.shardingsphere.jdbc.dao.impl.OrderDaoImpl;
import tutorial.shardingsphere.jdbc.util.YamlDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class YamlConfigPreciseShardingDatabaseTest {

    private static IOrderDao orderDao;

    @BeforeClass
    public static void init() throws SQLException, IOException {
        DataSource dataSource = YamlDataSourceFactory.getDataSource();
        orderDao = new OrderDaoImpl(dataSource);
    }

    @Test
    public void test() {
        orderDao.createTableIfNotExists();
        orderDao.truncateTable();
        Assert.assertEquals(0, orderDao.select().size());
        List original = new ArrayList<>();
        for (long i = 1; i <= 2; i++) {
            Order order = new Order(i, "Order " + i);
            order.setOrderId(orderDao.insert(order));
            original.add(order);
        }
        List actual = orderDao.select();
        Assert.assertEquals(original.size(), actual.size());
        actual.forEach(order -> Assert.assertTrue(original.contains(order)));
    }
}

测试执行结果略。


总结

与 【Sharding-JDBC 数据源分片:Java 配置实现基于原生 JDBC 的精确分片方案】 中示例区别:

  • 新增 Yaml 配置文件;
  • 重新定义获取数据源的工厂类。

你可能感兴趣的:(Sharding-JDBC 数据源分片:Yaml 配置实现基于原生 JDBC 的精确分片方案)