[seata]seata client sdk无法使用opengauss驱动创建本地数据库连接

2023-12-14 368 views
6

目前使用1.4.2或者1.7.0客户端sdk与springboot集成使用时,数据库驱动使用opengauss连接,数据库为南大通用8C,发现应用启动时,提示nullpoint exception,查看异常位置是seata通过数据源url解析dbtype时,调用了druid包的JdbcUtils的getDbTypeRaw接口返回null值,但是查看getDbTypeRaw方法只有当入参rawUrl为null时,才会返回null。

============================= 异常信息: Caused by: java.lang.NullPointerException: null at io.seata.rm.datasource.util.JdbcUtils.getDbType(JdbcUtils.java:54) at io.seata.rm.datasource.DataSourceProxy.init(DataSourceProxy.java:89) at io.seata.rm.datasource.DataSourceProxy.(DataSourceProxy.java:82) at io.seata.rm.datasource.DataSourceProxy.(DataSourceProxy.java:67) at io.seata.spring.annotation.datasource.SeataAutoDataSourceProxyCreator.buildProxy(SeataAutoDataSourceProxyCreator.java:125) at io.seata.spring.annotation.datasource.SeataAutoDataSourceProxyCreator.wrapIfNecessary(SeataAutoDataSourceProxyCreator.java:99) at org.springframework.aop.framework.autoproxy.AbstractAutoProxyCreator.postProcessAfterInitialization(AbstractAutoProxyCreator.java:300) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.applyBeanPostProcessorsAfterInitialization(AbstractAutowireCapableBeanFactory.java:430) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1803) at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:594)

================================= 应用服务pom依赖版本为:

io.seata seata-spring-boot-starter 1.4.2

================== 数据库连接配置为: spring: datasource: url: jdbc:opengauss://***:5432/ima_outpatient driver-class-name: org.opengauss.Driver username: ** password: **

====================== 以下是seata 1.4.2 client sdk的部分代码: io.seata.rm.datasource.util.JdbcUtils: public static String getDbType(String jdbcUrl) { return getDbTypeParser().parseFromJdbcUrl(jdbcUrl).toLowerCase(); }

io.seata.sqlparser.druid.DruidDbTypeParserImpl: class DruidDbTypeParserImpl implements DbTypeParser { DruidDbTypeParserImpl() { }

public String parseFromJdbcUrl(String jdbcUrl) {
    **return JdbcUtils.getDbType(jdbcUrl, (String)null);**
}
}

com.alibaba.druid.util.JdbcUtils: public static String getDbType(String rawUrl, String driverClassName) { DbType dbType = getDbTypeRaw(rawUrl, driverClassName); return dbType == null ? null : dbType.name(); }

public static DbType getDbTypeRaw(String rawUrl, String driverClassName) { if (rawUrl == null) { return null; } else if (!rawUrl.startsWith("jdbc:derby:") && !rawUrl.startsWith("jdbc:log4jdbc:derby:")) { if (!rawUrl.startsWith("jdbc:mysql:") && !rawUrl.startsWith("jdbc:cobar:") && !rawUrl.startsWith("jdbc:log4jdbc:mysql:")) { if (rawUrl.startsWith("jdbc:mariadb:")) { return DbType.mariadb; ...... } else if (!rawUrl.startsWith("jdbc:pivotal:greenplum:") && !rawUrl.startsWith("jdbc:datadirect:greenplum:")) {

支持opengauss
                                                            **return !rawUrl.startsWith("jdbc:opengauss:") && !rawUrl.startsWith("jdbc:gaussdb:") && !rawUrl.startsWith("jdbc:dws:iam:") ? null : DbType.gaussdb;**
                                                        } else {
                                                            return DbType.greenplum;
                                                        }

回答

3

目前seata还未支持opengauss驱动

5

会有版本计划支撑吗,或者预计在什么版本支持

6

这个是的,用opengauss的名称主要是想验证下差异,我们现在就是pg库,seata是没有问题的,现在只能使用postgresql名称来烟灶seata在国产数据库上的适配性。

7

可以参考rm-datasource模块自行扩展实现,欢迎pr