Skip to content

Commit 8e62dd8

Browse files
authored
[Fix-7291][datasource] Compatible with different versions of MySQL data source loading (#7291) (#7305)
1 parent 99b8ec6 commit 8e62dd8

28 files changed

Lines changed: 113 additions & 56 deletions

File tree

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/client/CommonDataSourceClient.java

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.dolphinscheduler.plugin.datasource.api.provider.JdbcDataSourceProvider;
2121
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam;
2222
import org.apache.dolphinscheduler.spi.datasource.DataSourceClient;
23+
import org.apache.dolphinscheduler.spi.enums.DbType;
2324
import org.apache.dolphinscheduler.spi.utils.StringUtils;
2425

2526
import java.sql.Connection;
@@ -46,11 +47,11 @@ public class CommonDataSourceClient implements DataSourceClient {
4647
protected DataSource dataSource;
4748
protected JdbcTemplate jdbcTemplate;
4849

49-
public CommonDataSourceClient(BaseConnectionParam baseConnectionParam) {
50+
public CommonDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) {
5051
this.baseConnectionParam = baseConnectionParam;
5152
preInit();
5253
checkEnv(baseConnectionParam);
53-
initClient(baseConnectionParam);
54+
initClient(baseConnectionParam, dbType);
5455
checkClient();
5556
}
5657

@@ -63,8 +64,8 @@ protected void checkEnv(BaseConnectionParam baseConnectionParam) {
6364
checkUser(baseConnectionParam);
6465
}
6566

66-
protected void initClient(BaseConnectionParam baseConnectionParam) {
67-
this.dataSource = JdbcDataSourceProvider.createJdbcDataSource(baseConnectionParam);
67+
protected void initClient(BaseConnectionParam baseConnectionParam, DbType dbType) {
68+
this.dataSource = JdbcDataSourceProvider.createJdbcDataSource(baseConnectionParam, dbType);
6869
this.jdbcTemplate = new JdbcTemplate(dataSource);
6970
}
7071

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/plugin/DataSourceClientProvider.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ public Connection getConnection(DbType dbType, ConnectionParam connectionParam)
6161
if (null == dataSourceChannel) {
6262
throw new RuntimeException(String.format("datasource plugin '%s' is not found", dbType.getDescp()));
6363
}
64-
return dataSourceChannel.createDataSourceClient(baseConnectionParam);
64+
return dataSourceChannel.createDataSourceClient(baseConnectionParam, dbType);
6565
});
6666
return dataSourceClient.getConnection();
6767
}

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/main/java/org/apache/dolphinscheduler/plugin/datasource/api/provider/JdbcDataSourceProvider.java

Lines changed: 31 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,10 +17,15 @@
1717

1818
package org.apache.dolphinscheduler.plugin.datasource.api.provider;
1919

20+
import org.apache.dolphinscheduler.plugin.datasource.api.utils.DataSourceUtils;
2021
import org.apache.dolphinscheduler.plugin.datasource.api.utils.PasswordUtils;
2122
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam;
23+
import org.apache.dolphinscheduler.spi.enums.DbType;
2224
import org.apache.dolphinscheduler.spi.utils.Constants;
2325
import org.apache.dolphinscheduler.spi.utils.PropertyUtils;
26+
import org.apache.dolphinscheduler.spi.utils.StringUtils;
27+
28+
import java.sql.Driver;
2429

2530
import org.slf4j.Logger;
2631
import org.slf4j.LoggerFactory;
@@ -34,10 +39,14 @@ public class JdbcDataSourceProvider {
3439

3540
private static final Logger logger = LoggerFactory.getLogger(JdbcDataSourceProvider.class);
3641

37-
public static HikariDataSource createJdbcDataSource(BaseConnectionParam properties) {
42+
public static HikariDataSource createJdbcDataSource(BaseConnectionParam properties, DbType dbType) {
3843
logger.info("Creating HikariDataSource pool for maxActive:{}", PropertyUtils.getInt(Constants.SPRING_DATASOURCE_MAX_ACTIVE, 50));
3944
HikariDataSource dataSource = new HikariDataSource();
4045

46+
//TODO Support multiple versions of data sources
47+
ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
48+
loaderJdbcDriver(classLoader, properties, dbType);
49+
4150
dataSource.setDriverClassName(properties.getDriverClassName());
4251
dataSource.setJdbcUrl(properties.getJdbcUrl());
4352
dataSource.setUsername(properties.getUser());
@@ -80,4 +89,25 @@ public static HikariDataSource createOneSessionJdbcDataSource(BaseConnectionPara
8089
return dataSource;
8190
}
8291

92+
protected static void loaderJdbcDriver(ClassLoader classLoader, BaseConnectionParam properties, DbType dbType) {
93+
String drv = StringUtils.isBlank(properties.getDriverClassName()) ? DataSourceUtils.getDatasourceProcessor(dbType).getDatasourceDriver() : properties.getDriverClassName();
94+
try {
95+
final Class<?> clazz = Class.forName(drv, true, classLoader);
96+
final Driver driver = (Driver) clazz.newInstance();
97+
if (!driver.acceptsURL(properties.getJdbcUrl())) {
98+
logger.warn("Jdbc driver loading error. Driver {} cannot accept url.", drv);
99+
throw new RuntimeException("Jdbc driver loading error.");
100+
}
101+
if (dbType.equals(DbType.MYSQL)) {
102+
if (driver.getMajorVersion() >= 8) {
103+
properties.setDriverClassName(drv);
104+
} else {
105+
properties.setDriverClassName(Constants.COM_MYSQL_JDBC_DRIVER);
106+
}
107+
}
108+
} catch (final Exception e) {
109+
logger.warn("The specified driver not suitable.");
110+
}
111+
}
112+
83113
}

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/client/CommonDataSourceClientTest.java

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@
2020
import org.apache.dolphinscheduler.plugin.datasource.api.datasource.mysql.MysqlConnectionParam;
2121
import org.apache.dolphinscheduler.plugin.datasource.api.provider.JdbcDataSourceProvider;
2222
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam;
23+
import org.apache.dolphinscheduler.spi.enums.DbType;
2324

2425
import java.sql.Connection;
2526

@@ -79,9 +80,9 @@ public void testCheckEnv() {
7980
@Test
8081
public void testInitClient() {
8182
BaseConnectionParam baseConnectionParam = new MysqlConnectionParam();
82-
PowerMockito.doNothing().when(commonDataSourceClient).initClient(Mockito.any(BaseConnectionParam.class));
83-
commonDataSourceClient.initClient(baseConnectionParam);
84-
Mockito.verify(commonDataSourceClient).initClient(Mockito.any(BaseConnectionParam.class));
83+
PowerMockito.doNothing().when(commonDataSourceClient).initClient(Mockito.any(BaseConnectionParam.class), Mockito.any());
84+
commonDataSourceClient.initClient(baseConnectionParam, DbType.MYSQL);
85+
Mockito.verify(commonDataSourceClient).initClient(Mockito.any(BaseConnectionParam.class), Mockito.any());
8586
}
8687

8788
@Test

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-api/src/test/java/org/apache/dolphinscheduler/plugin/datasource/api/provider/JdbcDataSourceProviderTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.dolphinscheduler.plugin.datasource.api.provider;
1919

2020
import org.apache.dolphinscheduler.plugin.datasource.api.datasource.mysql.MysqlConnectionParam;
21+
import org.apache.dolphinscheduler.spi.enums.DbType;
2122

2223
import org.junit.Assert;
2324
import org.junit.Test;
@@ -37,8 +38,8 @@ public class JdbcDataSourceProviderTest {
3738
public void testCreateJdbcDataSource() {
3839
PowerMockito.mockStatic(JdbcDataSourceProvider.class);
3940
HikariDataSource dataSource = PowerMockito.mock(HikariDataSource.class);
40-
PowerMockito.when(JdbcDataSourceProvider.createJdbcDataSource(Mockito.any())).thenReturn(dataSource);
41-
Assert.assertNotNull(JdbcDataSourceProvider.createJdbcDataSource(new MysqlConnectionParam()));
41+
PowerMockito.when(JdbcDataSourceProvider.createJdbcDataSource(Mockito.any(), Mockito.any())).thenReturn(dataSource);
42+
Assert.assertNotNull(JdbcDataSourceProvider.createJdbcDataSource(new MysqlConnectionParam(), DbType.MYSQL));
4243
}
4344

4445
@Test

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-clickhouse/src/main/java/org/apache/dolphinscheduler/plugin/datasource/clickhouse/ClickhouseDataSourceChannel.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@
2020
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam;
2121
import org.apache.dolphinscheduler.spi.datasource.DataSourceChannel;
2222
import org.apache.dolphinscheduler.spi.datasource.DataSourceClient;
23+
import org.apache.dolphinscheduler.spi.enums.DbType;
2324

2425
public class ClickhouseDataSourceChannel implements DataSourceChannel {
2526

2627
@Override
27-
public DataSourceClient createDataSourceClient(BaseConnectionParam baseConnectionParam) {
28-
return new ClickhouseDataSourceClient(baseConnectionParam);
28+
public DataSourceClient createDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) {
29+
return new ClickhouseDataSourceClient(baseConnectionParam, dbType);
2930
}
3031
}

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-clickhouse/src/main/java/org/apache/dolphinscheduler/plugin/datasource/clickhouse/ClickhouseDataSourceClient.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919

2020
import org.apache.dolphinscheduler.plugin.datasource.api.client.CommonDataSourceClient;
2121
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam;
22+
import org.apache.dolphinscheduler.spi.enums.DbType;
2223

2324
public class ClickhouseDataSourceClient extends CommonDataSourceClient {
2425

25-
public ClickhouseDataSourceClient(BaseConnectionParam baseConnectionParam) {
26-
super(baseConnectionParam);
26+
public ClickhouseDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) {
27+
super(baseConnectionParam, dbType);
2728
}
2829

2930
}

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-clickhouse/src/test/java/org/apache/dolphinscheduler/plugin/datasource/clickhouse/ClickhouseDataSourceChannelTest.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
package org.apache.dolphinscheduler.plugin.datasource.clickhouse;
1919

2020
import org.apache.dolphinscheduler.plugin.datasource.api.datasource.clickhouse.ClickhouseConnectionParam;
21+
import org.apache.dolphinscheduler.spi.enums.DbType;
2122

2223
import org.junit.Assert;
2324
import org.junit.Test;
@@ -37,7 +38,7 @@ public class ClickhouseDataSourceChannelTest {
3738
public void testCreateDataSourceClient() {
3839
ClickhouseDataSourceChannel sourceChannel = PowerMockito.mock(ClickhouseDataSourceChannel.class);
3940
ClickhouseDataSourceClient dataSourceClient = PowerMockito.mock(ClickhouseDataSourceClient.class);
40-
PowerMockito.when(sourceChannel.createDataSourceClient(Mockito.any())).thenReturn(dataSourceClient);
41-
Assert.assertNotNull(sourceChannel.createDataSourceClient(new ClickhouseConnectionParam()));
41+
PowerMockito.when(sourceChannel.createDataSourceClient(Mockito.any(), Mockito.any())).thenReturn(dataSourceClient);
42+
Assert.assertNotNull(sourceChannel.createDataSourceClient(new ClickhouseConnectionParam(), DbType.CLICKHOUSE));
4243
}
4344
}

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-db2/src/main/java/org/apache/dolphinscheduler/plugin/datasource/db2/DB2DataSourceChannel.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,12 @@
2020
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam;
2121
import org.apache.dolphinscheduler.spi.datasource.DataSourceChannel;
2222
import org.apache.dolphinscheduler.spi.datasource.DataSourceClient;
23+
import org.apache.dolphinscheduler.spi.enums.DbType;
2324

2425
public class DB2DataSourceChannel implements DataSourceChannel {
2526

2627
@Override
27-
public DataSourceClient createDataSourceClient(BaseConnectionParam baseConnectionParam) {
28-
return new DB2DataSourceClient(baseConnectionParam);
28+
public DataSourceClient createDataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) {
29+
return new DB2DataSourceClient(baseConnectionParam, dbType);
2930
}
3031
}

dolphinscheduler-datasource-plugin/dolphinscheduler-datasource-db2/src/main/java/org/apache/dolphinscheduler/plugin/datasource/db2/DB2DataSourceClient.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,11 +19,12 @@
1919

2020
import org.apache.dolphinscheduler.plugin.datasource.api.client.CommonDataSourceClient;
2121
import org.apache.dolphinscheduler.spi.datasource.BaseConnectionParam;
22+
import org.apache.dolphinscheduler.spi.enums.DbType;
2223

2324
public class DB2DataSourceClient extends CommonDataSourceClient {
2425

25-
public DB2DataSourceClient(BaseConnectionParam baseConnectionParam) {
26-
super(baseConnectionParam);
26+
public DB2DataSourceClient(BaseConnectionParam baseConnectionParam, DbType dbType) {
27+
super(baseConnectionParam, dbType);
2728
}
2829

2930
}

0 commit comments

Comments
 (0)