注册
Sharding框架适配达梦
技术分享/ 文章详情 /

Sharding框架适配达梦

归途 2024/08/16 1108 0 3

1.概述

Apache ShardingSphere是一组款开源的分布式数据库中间件,由Sharding-JDBC、Sharding-Proxy和Sharding-Sidecar三款产品组成。其中sharding-jdbc主要提供分库分表、读写分离、分片策略、分布式主键、分布式事务、数据治理相关功能。
Sharding框架默认不支持DM数据库,本文提供了修改sharding-jdbc支持DM库的方法。

2.修改

修改使用实现原有接口的方式,不用修改源码重新打包。

2.1实现DataSourceMetaData接口

实现该接口用于支持DM数据库类型并解析DM URL字符串

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) { System.out.println("url-----------------"+url); 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; }

2.2实现BranchDatabaseType接口

语法解析使用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); } @Override public DatabaseType getTrunkDatabaseType() { return DatabaseTypes.getActualDatabaseType("Oracle"); }

2.3Resource增加META_INF信息

新增org.apache.shardingsphere.spi.database.type.DatabaseType文件,内容:

com.example.demo.zhao.DMDatabaseType

2.4Application.propriets配置

spring.shardingsphere.datasource.names=m1,m2

# ?????????????
spring.main.allow-bean-definition-overriding=true

# ?????????????????????????????

#spring.shardingsphere.datasource.jdbcUrl=jdbc:dm://192.168.31.254:5236/SYSDBA1
#spring.datasource.druid.url=jdbc:dm://192.168.31.254:5236/SYSDBA1
spring.shardingsphere.datasource.m1.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m1.driver-class-name=dm.jdbc.driver.DmDriver
#spring.shardingsphere.datasource.m1.jdbc-url=jdbc:dm://192.168.31.254:5236/SYSDBA1
#spring.shardingsphere.datasource.m1.jdbc-url=jdbc:dm://127.0.0.1:5236/SYSDBA1
spring.shardingsphere.datasource.m1.url=jdbc:dm://127.0.0.1:5236
#spring.shardingsphere.datasource.m1.username=SYSDBA
spring.shardingsphere.datasource.m1.username=PAY_ORDER1
#spring.shardingsphere.datasource.m1.password=SYSDBA
spring.shardingsphere.datasource.m1.password=123456789

spring.shardingsphere.datasource.m2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.m2.driver-class-name=dm.jdbc.driver.DmDriver
#spring.shardingsphere.datasource.m2.jdbc-url=jdbc:dm://127.0.0.1:5236/SYSDBA2
#spring.shardingsphere.datasource.m2.url=jdbc:dm://127.0.0.1:5236/SYSDBA2
spring.shardingsphere.datasource.m2.url=jdbc:dm://127.0.0.1:5236
spring.shardingsphere.datasource.m2.username=PAY_ORDER2
#spring.shardingsphere.datasource.m2.password=SYSDBA
spring.shardingsphere.datasource.m2.password=123456789



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

spring.autoconfigure.exclude=com.alibaba.druid.spring.boot.autoconfigure.DruidDataSourceAutoConfigure,org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration

Properties文件中需要添加dm方言配置

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.DmDialect

demo

见附件;sharding-db-master.zip

评论
后发表回复

作者

文章

阅读量

获赞

扫一扫
联系客服