shardingSphere 官方声明支持任意实现JDBC规范的数据库,但是目前支持的数据库有MySQL,Oracle,SQLServer和PostgreSQL。对达梦数据库并不适配,如果要使用shardingSphere对达梦数据库进行操作,需要对shardingSphere 进行扩展,具体操作步骤如下:
1、在自己项目中引入shardingSphere的依赖:这里以4.1.1的版本为例,这里要说明的是,不同版本的shardingSphere对数据库类型的声明代码文件的位置不同,在进行扩展时要注意版本。
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
2、在自己的项目中新建两个类:
1.DMDatabaseType
package com.example.shardingdemo.util;
import org.apache.shardingsphere.spi.database.type.BranchDatabaseType;
import org.apache.shardingsphere.spi.database.type.DatabaseType;
import org.apache.shardingsphere.underlying.common.database.type.DatabaseTypes;
import java.util.Collection;
import java.util.Collections;
/**
* Database type of Oracle.
*/
public final class DMDatabaseType implements BranchDatabaseType {
@Override
public String getName() {
System.out.println("获取达梦名称");
return "DM";
}
@Override
public Collection<String> getJdbcUrlPrefixAlias() {
return Collections.emptyList();
}
@Override
public DMDataSourceMetaData getDataSourceMetaData(final String url, final String username) {
return new DMDataSourceMetaData(url, username);
}
//作为MySQL的子集,sql解析等操作使用MySQL的实现
@Override
public DatabaseType getTrunkDatabaseType() {
return DatabaseTypes.getActualDatabaseType("MySQL");
}
}
-
DMDataSourceMetaData
package com.example.shardingdemo.util; import com.google.common.base.Strings; import lombok.Getter; import org.apache.shardingsphere.spi.database.metadata.DataSourceMetaData; import org.apache.shardingsphere.underlying.common.database.metadata.UnrecognizedDatabaseURLException; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * Data source meta data for Oracle. */ @Getter public final class DMDataSourceMetaData implements DataSourceMetaData { private static final int DEFAULT_PORT = 5236; private final String hostName; private final int port; private final String catalog; private final String schema; private final Pattern pattern = Pattern.compile("jdbc:dm://([\\w\\-\\.]+):?([0-9]*)/([\\w\\-]+)", Pattern.CASE_INSENSITIVE); public DMDataSourceMetaData(final String url, final String username) { Matcher matcher = pattern.matcher(url); if (!matcher.find()) { throw new UnrecognizedDatabaseURLException(url, pattern.pattern()); } hostName = matcher.group(1); port = Strings.isNullOrEmpty(matcher.group(2)) ? DEFAULT_PORT : Integer.valueOf(matcher.group(2)); catalog = matcher.group(3); schema = username; } }
利用spi机制,Resource下面创建META-INF/services 目录里创建一个以服务接口命名的文件,4.1.1版本的shardingSphere的文件名称为:org.apache.shardingsphere.spi.database.type.DatabaseType,在文件中加上DMDatabaseType类的路径。
效果图为:
以上步骤就是给shardingSphere进行了外部拓展,使其适配了达梦数据库。
接下来就是在配置文件中配置好数据源和分片规则,就可以使用shardingSphere对达梦数据库进行分库分表操作了。以下是配置文件的相关代码:这里要注意的是,shardingSphere和shardingJDBC的配置是不一样的,不能混用,要不然报错。
server.port=8082
# sharding-jdbc 水平分表策略
# 配置数据源,给数据源起别名
spring.shardingsphere.datasource.names=m1,m2
# 一个实体类对应两张表,覆盖
spring.main.allow-bean-definition-overriding=true
# 配置数据源的具体内容,包含连接池,驱动,地址,用户名,密码
spring.shardingsphere.datasource.m1.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.m1.driver-class-name=dm.jdbc.driver.DmDriver
spring.shardingsphere.datasource.m1.jdbc-url=jdbc:dm://localhost:5236/W
spring.shardingsphere.datasource.m1.username=SYSDBA
spring.shardingsphere.datasource.m1.password=
spring.shardingsphere.datasource.m2.type=com.zaxxer.hikari.HikariDataSource
spring.shardingsphere.datasource.m2.driver-class-name=dm.jdbc.driver.DmDriver
spring.shardingsphere.datasource.m2.jdbc-url=jdbc:dm://localhost:5236/H
spring.shardingsphere.datasource.m2.username=SYSDBA
spring.shardingsphere.datasource.m2.password=
# 指定course表分布的情况,配置表在哪个数据库里,表的名称都是什么 m1.course_1,m1.course_2
spring.shardingsphere.sharding.tables.course.actual-data-nodes=m1.course_$->{1..2}
spring.shardingsphere.sharding.tables.course1.actual-data-nodes=m2.course1_$->{1..2}
# 指定 course 表里面主键 cid 的生成策略 SNOWFLAKE
spring.shardingsphere.sharding.tables.course.key-generator.column=cid
spring.shardingsphere.sharding.tables.course.key-generator.type=SNOWFLAKE
spring.shardingsphere.sharding.tables.course1.key-generator.column=cid1
spring.shardingsphere.sharding.tables.course1.key-generator.type=SNOWFLAKE
#spring.shardingsphere.sharding.tables.course.key-generator.type=AtomicLong
# 配置分表策略 约定 cid 值偶数添加到 course_1 表,如果 cid 是奇数添加到 course_2 表
spring.shardingsphere.sharding.tables.course.table-strategy.inline.sharding-column=cid
spring.shardingsphere.sharding.tables.course.table-strategy.inline.algorithm-expression=course_$->{cid % 2 + 1}
spring.shardingsphere.sharding.tables.course1.table-strategy.inline.sharding-column=cid1
spring.shardingsphere.sharding.tables.course1.table-strategy.inline.algorithm-expression=course1_$->{cid1 % 2 + 1}
# 打开 sql 输出日志
spring.shardingsphere.props.sql.show=true
到这里为止,就可以使用shardingSphere对达梦数据库进行基本的分库分表的操作了,更多的功能还没有进行研究,还是希望达梦官方可以对分库分表进行更多的支持,有更成熟的落地方案。