1、项目中分表分库插件用的是 shardingsphere,现在需要从mysql 数据转移到达梦数据库。
2、但是shardingsphere并不支持达梦数据库,所以查看了源码。基于shardingsphere(4.1.1版本)源码优化了支持达梦数据库大部分sql查询能力,(复合查询需要自己拆解)。
1、第一步 首先找到
DataSourceMetaData 接口实现该接口 这里需要注意java 包路径
org.apache.shardingsphere.underlying.common.database.metadata.dialect
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;
}
}
2、实现
BranchDatabaseType接口
包路径 org.apache.shardingsphere.underlying.common.database.type.dialect
* Database type of Oracle.
*/
public final class DMDatabaseType implements BranchDatabaseType {
@Override
public String getName() {
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");
}
}
解析器 选择的MYSQL, (我测试了下 选择orcal时分页查询会返回多表查询的所有结果。)
当然也可以自己实现解析器
自定义解析器在这个包路径 自己新建一个达梦模块就好。</