背景
最近在寫多資料源的時候,遇到了 GP,因為之前倒騰過 Oracle 和 Gaussdb,他們也都有 schema 的概念,以為這個也差不多,但是發現在連接配接池那塊總是報錯 schema,如下
java.lang.AbstractMethodError: com.pivotal.jdbc.greenplumbase.ddu.setSchema
後來在一番倒騰,找到了解決方案~
方案
1、URL 拼接 Schema
這個方案是針對使用 com.pivotal.jdbc.GreenplumDriver 驅動來講的,URL 規範 jdbc:pivotal:greenplum:// 因為在如下連接配接的時候,絕對報上面的錯
<dependency>
<groupId>com.pivotal.greenplumgroupId>
<artifactId>greenplumartifactId>
<version>1.0version>
dependency>
HikariConfig configuration = new HikariConfig();
configuration.setJdbcUrl(url);
configuration.setUsername(username);
configuration.setPassword(password);
configuration.setDriverClassName(driverName);
configuration.setSchema(schema);
HikariDataSource hikariDataSource = new HikariDataSource(configuration);
是以我們需要稍微改造下,采用拼接 URL,代碼如下
HikariConfig configuration = new HikariConfig();
// 處理特殊資料庫的 URL
DataSourceEntityUtil.evalParam(dataSource);
configuration.setJdbcUrl(dataSource.getUrl());
configuration.setUsername(username);
configuration.setPassword(password);
configuration.setDriverClassName(driverName);
configuration.setSchema(dataSource.getSchema());
HikariDataSource hikariDataSource = new HikariDataSource(configuration);
public class DataSourceEntityUtil {
public static void evalParam(DataSourceEntity dataSource) {
Integer dataSourceType = dataSource.getDataSourceType();
if (DataSourceTypeEnum.GREENPLUM.getType().equals(dataSourceType)) {
dataSource.setUrl(buildUrlForGreenPlum(dataSource));
// 清空 Schema
dataSource.setSchema(null);
}
}
private static String buildUrlForGreenPlum(DataSourceEntity dataSource) {
String schema = dataSource.getSchema();
String url = dataSource.getUrl() + ";initializationString=set search_path to " + schema;
return url;
}
}
<dependency>
<groupId>org.postgresqlgroupId>
<artifactId>postgresqlartifactId>
<version>42.1.1version>
dependency>
HikariConfig configuration = new HikariConfig();
configuration.setJdbcUrl(url);
configuration.setUsername(username);
configuration.setPassword(password);
configuration.setDriverClassName(driverName);
configuration.setSchema(schema);
HikariDataSource hikariDataSource = new HikariDataSource(configuration);