背景
最近在写多数据源的时候,遇到了 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.greenplum</groupId><artifactId>greenplum</artifactId><version>1.0</version></dependency>
HikariConfigconfiguration=newHikariConfig(); configuration.setJdbcUrl(url); configuration.setUsername(username); configuration.setPassword(password); configuration.setDriverClassName(driverName); configuration.setSchema(schema); HikariDataSourcehikariDataSource=newHikariDataSource(configuration);
所以我们需要稍微改造下,采用拼接 URL,代码如下
HikariConfigconfiguration=newHikariConfig(); // 处理特殊数据库的 URLDataSourceEntityUtil.evalParam(dataSource); configuration.setJdbcUrl(dataSource.getUrl()); configuration.setUsername(username); configuration.setPassword(password); configuration.setDriverClassName(driverName); configuration.setSchema(dataSource.getSchema()); HikariDataSourcehikariDataSource=newHikariDataSource(configuration);
publicclassDataSourceEntityUtil { publicstaticvoidevalParam(DataSourceEntitydataSource) { IntegerdataSourceType=dataSource.getDataSourceType(); if (DataSourceTypeEnum.GREENPLUM.getType().equals(dataSourceType)) { dataSource.setUrl(buildUrlForGreenPlum(dataSource)); // 清空 SchemadataSource.setSchema(null); } } privatestaticStringbuildUrlForGreenPlum(DataSourceEntitydataSource) { Stringschema=dataSource.getSchema(); Stringurl=dataSource.getUrl() +";initializationString=set search_path to "+schema; returnurl; } }
2、使用 setSchema 方法
<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.1.1</version></dependency>
首先这种驱动,需要按照它的 URL 规范 jdbc:postgresql://XXX,然后使用下面这种方式即可,但唯一的缺点就是如果你项目中还有 GaussDB,那么它会和 GaussDB 的驱动 JAR 会依赖冲突,所以就只能转向第一种方案了,否则的话用这个即可
HikariConfigconfiguration=newHikariConfig(); configuration.setJdbcUrl(url); configuration.setUsername(username); configuration.setPassword(password); configuration.setDriverClassName(driverName); configuration.setSchema(schema); HikariDataSourcehikariDataSource=newHikariDataSource(configuration);