Skip to content

Commit a5aafa7

Browse files
authored
[Fix][Connector-JDBC] Fix JDBC driver selection for data source connections (#8986)
1 parent a06800e commit a5aafa7

File tree

57 files changed

+715
-78
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

57 files changed

+715
-78
lines changed

Diff for: docs/en/connector-v2/changelog/connector-jdbc.md

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
| Change | Commit | Version |
44
| --- | --- | --- |
5+
|[Fix][Connector-JDBC] Fix JDBC driver selection for data source connections(#8986) | https://github.com/apache/seatunnel/pull/8986 | dev |
56
|[Fix][Connector-V2] Fix parse SqlServer JDBC Url error (#8784)|https://github.com/apache/seatunnel/commit/373d2162d3| dev |
67
|[Improve][Jdbc] Support upsert for opengauss (#8627)|https://github.com/apache/seatunnel/commit/56110bf392| dev |
78
|[Improve][Jdbc] Remove useless utils. (#8793)|https://github.com/apache/seatunnel/commit/36a7533e85| dev |

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/AbstractJdbcCatalog.java

+36-1
Original file line numberDiff line numberDiff line change
@@ -49,12 +49,14 @@
4949

5050
import java.sql.Connection;
5151
import java.sql.DatabaseMetaData;
52+
import java.sql.Driver;
5253
import java.sql.DriverManager;
5354
import java.sql.PreparedStatement;
5455
import java.sql.ResultSet;
5556
import java.sql.SQLException;
5657
import java.util.ArrayList;
5758
import java.util.Collections;
59+
import java.util.Enumeration;
5860
import java.util.HashMap;
5961
import java.util.LinkedHashMap;
6062
import java.util.List;
@@ -82,12 +84,15 @@ public abstract class AbstractJdbcCatalog implements Catalog {
8284

8385
protected final Map<String, Connection> connectionMap;
8486

87+
private final String driverClass;
88+
8589
public AbstractJdbcCatalog(
8690
String catalogName,
8791
String username,
8892
String pwd,
8993
JdbcUrlUtil.UrlInfo urlInfo,
90-
String defaultSchema) {
94+
String defaultSchema,
95+
String driverClass) {
9196

9297
checkArgument(StringUtils.isNotBlank(username));
9398
checkArgument(StringUtils.isNotBlank(urlInfo.getUrlWithoutDatabase()));
@@ -100,6 +105,7 @@ public AbstractJdbcCatalog(
100105
this.suffix = urlInfo.getSuffix();
101106
this.defaultSchema = Optional.ofNullable(defaultSchema);
102107
this.connectionMap = new ConcurrentHashMap<>();
108+
this.driverClass = driverClass;
103109
}
104110

105111
@Override
@@ -116,6 +122,35 @@ protected Connection getConnection(String url) {
116122
if (connectionMap.containsKey(url)) {
117123
return connectionMap.get(url);
118124
}
125+
if (driverClass != null) {
126+
log.info("try to find driver {}", driverClass);
127+
java.util.Properties info = new java.util.Properties();
128+
if (username != null) {
129+
info.put("user", username);
130+
}
131+
if (pwd != null) {
132+
info.put("password", pwd);
133+
}
134+
Enumeration<Driver> drivers = DriverManager.getDrivers();
135+
try {
136+
// Driver Manager may load the wrong driver, prioritize finding the driver by class
137+
// name
138+
while (drivers.hasMoreElements()) {
139+
Driver driver = drivers.nextElement();
140+
if (StringUtils.equals(driver.getClass().getName(), driverClass)) {
141+
try {
142+
Connection connection = driver.connect(url, info);
143+
connectionMap.put(url, connection);
144+
return connection;
145+
} catch (Exception e) {
146+
log.info("try connector failed", e);
147+
}
148+
}
149+
}
150+
} catch (Exception e) {
151+
log.info("find driver error, back to DriverManager.getConnection", e);
152+
}
153+
}
119154
try {
120155
Connection connection = DriverManager.getConnection(url, username, pwd);
121156
connectionMap.put(url, connection);

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/JdbcCatalogOptions.java

+2
Original file line numberDiff line numberDiff line change
@@ -84,4 +84,6 @@ public interface JdbcCatalogOptions {
8484
.booleanType()
8585
.defaultValue(true)
8686
.withDescription("Create index or not when auto create table");
87+
88+
Option<String> DRIVER = Options.key("driver").stringType().noDefaultValue();
8789
}

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ public DamengCatalog(
6464
String username,
6565
String pwd,
6666
JdbcUrlUtil.UrlInfo urlInfo,
67-
String defaultSchema) {
68-
super(catalogName, username, pwd, urlInfo, defaultSchema);
67+
String defaultSchema,
68+
String driverClass) {
69+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
6970
}
7071

7172
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/dm/DamengCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5252
options.get(JdbcCatalogOptions.USERNAME),
5353
options.get(JdbcCatalogOptions.PASSWORD),
5454
urlInfo,
55-
options.get(JdbcCatalogOptions.SCHEMA));
55+
options.get(JdbcCatalogOptions.SCHEMA),
56+
options.get(JdbcCatalogOptions.DRIVER));
5657
}
5758

5859
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/highgo/HighGoCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ public HighGoCatalog(
2626
String username,
2727
String pwd,
2828
JdbcUrlUtil.UrlInfo urlInfo,
29-
String defaultSchema) {
30-
super(catalogName, username, pwd, urlInfo, defaultSchema);
29+
String defaultSchema,
30+
String driverClass) {
31+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
3132
}
3233
}

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/highgo/HighGoCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
4242
options.get(JdbcCatalogOptions.USERNAME),
4343
options.get(JdbcCatalogOptions.PASSWORD),
4444
urlInfo,
45-
options.get(JdbcCatalogOptions.SCHEMA));
45+
options.get(JdbcCatalogOptions.SCHEMA),
46+
options.get(JdbcCatalogOptions.DRIVER));
4647
}
4748

4849
public String factoryIdentifier() {

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/iris/IrisCatalog.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,12 @@ public class IrisCatalog extends AbstractJdbcCatalog {
6161
"SELECT TABLE_SCHEMA,TABLE_NAME FROM INFORMATION_SCHEMA.Tables WHERE TABLE_SCHEMA='%s' and TABLE_TYPE != 'SYSTEM TABLE' and TABLE_TYPE != 'SYSTEM VIEW'";
6262

6363
public IrisCatalog(
64-
String catalogName, String username, String password, JdbcUrlUtil.UrlInfo urlInfo) {
65-
super(catalogName, username, password, urlInfo, null);
64+
String catalogName,
65+
String username,
66+
String password,
67+
JdbcUrlUtil.UrlInfo urlInfo,
68+
String driverClass) {
69+
super(catalogName, username, password, urlInfo, null, driverClass);
6670
}
6771

6872
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/iris/IrisCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5151
catalogName,
5252
options.get(JdbcCatalogOptions.USERNAME),
5353
options.get(JdbcCatalogOptions.PASSWORD),
54-
urlInfo);
54+
urlInfo,
55+
options.get(JdbcCatalogOptions.DRIVER));
5556
}
5657

5758
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/mysql/MySqlCatalog.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -62,8 +62,12 @@ public class MySqlCatalog extends AbstractJdbcCatalog {
6262
private MySqlTypeConverter typeConverter;
6363

6464
public MySqlCatalog(
65-
String catalogName, String username, String pwd, JdbcUrlUtil.UrlInfo urlInfo) {
66-
super(catalogName, username, pwd, urlInfo, null);
65+
String catalogName,
66+
String username,
67+
String pwd,
68+
JdbcUrlUtil.UrlInfo urlInfo,
69+
String driverClass) {
70+
super(catalogName, username, pwd, urlInfo, null, driverClass);
6771
this.version = resolveVersion();
6872
this.typeConverter = new MySqlTypeConverter(version);
6973
}

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/mysql/MySqlCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5151
catalogName,
5252
options.get(JdbcCatalogOptions.USERNAME),
5353
options.get(JdbcCatalogOptions.PASSWORD),
54-
urlInfo);
54+
urlInfo,
55+
options.get(JdbcCatalogOptions.DRIVER));
5556
}
5657

5758
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oceanbase/OceanBaseCatalogFactory.java

+4-2
Original file line numberDiff line numberDiff line change
@@ -71,13 +71,15 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
7171
options.get(JdbcCatalogOptions.USERNAME),
7272
options.get(JdbcCatalogOptions.PASSWORD),
7373
urlInfo,
74-
options.get(JdbcCatalogOptions.SCHEMA));
74+
options.get(JdbcCatalogOptions.SCHEMA),
75+
options.get(JdbcCatalogOptions.DRIVER));
7576
}
7677
return new OceanBaseMySqlCatalog(
7778
catalogName,
7879
options.get(JdbcCatalogOptions.USERNAME),
7980
options.get(JdbcCatalogOptions.PASSWORD),
80-
urlInfo);
81+
urlInfo,
82+
options.get(JdbcCatalogOptions.DRIVER));
8183
}
8284

8385
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oceanbase/OceanBaseMySqlCatalog.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,12 @@ public class OceanBaseMySqlCatalog extends AbstractJdbcCatalog {
6666
private OceanBaseMySqlTypeConverter typeConverter;
6767

6868
public OceanBaseMySqlCatalog(
69-
String catalogName, String username, String pwd, JdbcUrlUtil.UrlInfo urlInfo) {
70-
super(catalogName, username, pwd, urlInfo, null);
69+
String catalogName,
70+
String username,
71+
String pwd,
72+
JdbcUrlUtil.UrlInfo urlInfo,
73+
String driverClass) {
74+
super(catalogName, username, pwd, urlInfo, null, driverClass);
7175
this.typeConverter = new OceanBaseMySqlTypeConverter();
7276
}
7377

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oceanbase/OceanBaseOracleCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -38,8 +38,9 @@ public OceanBaseOracleCatalog(
3838
String username,
3939
String pwd,
4040
JdbcUrlUtil.UrlInfo urlInfo,
41-
String defaultSchema) {
42-
super(catalogName, username, pwd, urlInfo, defaultSchema);
41+
String defaultSchema,
42+
String driverClass) {
43+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
4344
}
4445

4546
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/opengauss/OpenGaussCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,9 @@ public OpenGaussCatalog(
3434
String username,
3535
String pwd,
3636
JdbcUrlUtil.UrlInfo urlInfo,
37-
String defaultSchema) {
38-
super(catalogName, username, pwd, urlInfo, defaultSchema);
37+
String defaultSchema,
38+
String driverClass) {
39+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
3940
}
4041

4142
@VisibleForTesting

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/opengauss/OpenGaussCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5252
options.get(JdbcCatalogOptions.USERNAME),
5353
options.get(JdbcCatalogOptions.PASSWORD),
5454
urlInfo,
55-
options.get(JdbcCatalogOptions.SCHEMA));
55+
options.get(JdbcCatalogOptions.SCHEMA),
56+
options.get(JdbcCatalogOptions.DRIVER));
5657
}
5758

5859
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCatalog.java

+7-4
Original file line numberDiff line numberDiff line change
@@ -81,14 +81,16 @@ public OracleCatalog(
8181
String username,
8282
String pwd,
8383
JdbcUrlUtil.UrlInfo urlInfo,
84-
String defaultSchema) {
84+
String defaultSchema,
85+
String driverClass) {
8586
this(
8687
catalogName,
8788
username,
8889
pwd,
8990
urlInfo,
9091
defaultSchema,
91-
JdbcOptions.DECIMAL_TYPE_NARROWING.defaultValue());
92+
JdbcOptions.DECIMAL_TYPE_NARROWING.defaultValue(),
93+
driverClass);
9294
}
9395

9496
public OracleCatalog(
@@ -97,8 +99,9 @@ public OracleCatalog(
9799
String pwd,
98100
JdbcUrlUtil.UrlInfo urlInfo,
99101
String defaultSchema,
100-
boolean decimalTypeNarrowing) {
101-
super(catalogName, username, pwd, urlInfo, defaultSchema);
102+
boolean decimalTypeNarrowing,
103+
String driverClass) {
104+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
102105
this.decimalTypeNarrowing = decimalTypeNarrowing;
103106
}
104107

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/oracle/OracleCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5454
options.get(JdbcCatalogOptions.PASSWORD),
5555
urlInfo,
5656
options.get(JdbcCatalogOptions.SCHEMA),
57-
options.get(JdbcOptions.DECIMAL_TYPE_NARROWING));
57+
options.get(JdbcOptions.DECIMAL_TYPE_NARROWING),
58+
options.get(JdbcOptions.DRIVER));
5859
}
5960

6061
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,9 @@ public PostgresCatalog(
8686
String username,
8787
String pwd,
8888
JdbcUrlUtil.UrlInfo urlInfo,
89-
String defaultSchema) {
90-
super(catalogName, username, pwd, urlInfo, defaultSchema);
89+
String defaultSchema,
90+
String driverClass) {
91+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
9192
}
9293

9394
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/psql/PostgresCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5252
options.get(JdbcCatalogOptions.USERNAME),
5353
options.get(JdbcCatalogOptions.PASSWORD),
5454
urlInfo,
55-
options.get(JdbcCatalogOptions.SCHEMA));
55+
options.get(JdbcCatalogOptions.SCHEMA),
56+
options.get(JdbcCatalogOptions.DRIVER));
5657
}
5758

5859
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/redshift/RedshiftCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ public RedshiftCatalog(
4545
String username,
4646
String pwd,
4747
JdbcUrlUtil.UrlInfo urlInfo,
48-
String schema) {
49-
super(catalogName, username, pwd, urlInfo, schema);
48+
String schema,
49+
String driverClass) {
50+
super(catalogName, username, pwd, urlInfo, schema, driverClass);
5051
}
5152

5253
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/redshift/RedshiftCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5959
options.get(JdbcCatalogOptions.USERNAME),
6060
options.get(JdbcCatalogOptions.PASSWORD),
6161
urlInfo,
62-
options.get(JdbcCatalogOptions.SCHEMA));
62+
options.get(JdbcCatalogOptions.SCHEMA),
63+
options.get(JdbcCatalogOptions.DRIVER));
6364
}
6465

6566
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/saphana/SapHanaCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -85,8 +85,9 @@ public SapHanaCatalog(
8585
String username,
8686
String pwd,
8787
JdbcUrlUtil.UrlInfo urlInfo,
88-
String defaultSchema) {
89-
super(catalogName, username, pwd, urlInfo, defaultSchema);
88+
String defaultSchema,
89+
String driverClass) {
90+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
9091
}
9192

9293
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/saphana/SapHanaCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
5252
options.get(JdbcCatalogOptions.USERNAME),
5353
options.get(JdbcCatalogOptions.PASSWORD),
5454
urlInfo,
55-
options.get(JdbcCatalogOptions.SCHEMA));
55+
options.get(JdbcCatalogOptions.SCHEMA),
56+
options.get(JdbcCatalogOptions.DRIVER));
5657
}
5758

5859
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/sqlserver/SqlServerCatalog.java

+3-2
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,9 @@ public SqlServerCatalog(
6464
String username,
6565
String pwd,
6666
JdbcUrlUtil.UrlInfo urlInfo,
67-
String defaultSchema) {
68-
super(catalogName, username, pwd, urlInfo, defaultSchema);
67+
String defaultSchema,
68+
String driverClass) {
69+
super(catalogName, username, pwd, urlInfo, defaultSchema, driverClass);
6970
}
7071

7172
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/sqlserver/SqlServerCatalogFactory.java

+2-1
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,8 @@ public Catalog createCatalog(String catalogName, ReadonlyConfig options) {
4545
options.get(JdbcCatalogOptions.USERNAME),
4646
options.get(JdbcCatalogOptions.PASSWORD),
4747
urlInfo,
48-
options.get(JdbcCatalogOptions.SCHEMA));
48+
options.get(JdbcCatalogOptions.SCHEMA),
49+
options.get(JdbcCatalogOptions.DRIVER));
4950
}
5051

5152
@Override

Diff for: seatunnel-connectors-v2/connector-jdbc/src/main/java/org/apache/seatunnel/connectors/seatunnel/jdbc/catalog/tidb/TiDBCatalog.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,11 @@
2323
public class TiDBCatalog extends MySqlCatalog {
2424

2525
public TiDBCatalog(
26-
String catalogName, String username, String pwd, JdbcUrlUtil.UrlInfo urlInfo) {
27-
super(catalogName, username, pwd, urlInfo);
26+
String catalogName,
27+
String username,
28+
String pwd,
29+
JdbcUrlUtil.UrlInfo urlInfo,
30+
String driverClass) {
31+
super(catalogName, username, pwd, urlInfo, driverClass);
2832
}
2933
}

0 commit comments

Comments
 (0)