java应用中如何配置可以同时兼容pg和opengs的jdbc驱动连接两个数据库

基于java研发的系统,之前一直用的postgresql13

目前有部分新业务需要基于opengauss6.0.3进行研发

因此,应用中有一段时间需要同时连接pg13和gs6

请教java中如何配置,能实现同时多数据源,一个数据源连接pg13,一个数据源连接gs6

谢谢。

答案内容由AI生成,仅供参考:

:white_check_mark: 总结:最佳实践清单

步骤 操作
:white_check_mark: 使用不同 DataSource 配置两个数据库
:white_check_mark: 使用正确的驱动类:org.postgresql.Driverorg.opengauss.Driver
:white_check_mark: 选用 opengauss-jdbc 官方版本(建议 6.0.3+)
:white_check_mark: 配置独立的连接 URL、用户名、密码、端口
:white_check_mark: pg_hba.conf 中允许访问并重启数据库
:white_check_mark: 禁用二进制传输(必要时)或升级驱动解决 timestamp 问题
点击此处查看详细分析解答

如何在 Java 应用中同时连接 PostgreSQL 13 和 openGauss 6.0.3?

在基于 Java 的系统中,如果需要在同一应用中同时连接 PostgreSQL 13 和 openGauss 6.0.3,可以通过 多数据源配置(Multiple Data Sources) 实现。以下是详细的配置方案与最佳实践,确保驱动兼容、类路径无冲突,并支持稳定运行。


:white_check_mark: 核心要点

  1. 使用两个不同的 JDBC 驱动:

    • PostgreSQL 13 使用标准的 postgresql JDBC 驱动(org.postgresql.Driver)。
    • openGauss 6.0.3 使用官方 opengauss-jdbc 驱动(org.opengauss.Driver)。
  2. 使用 独立的数据源(DataSource) 分别配置两个数据库连接。

  3. 避免 JAR 包冲突:避免使用错误版本或混用类路径。

  4. 推荐使用 Spring Boot 框架进行多数据源管理,便于集成和维护。


:hammer_and_wrench: 具体配置步骤(以 Spring Boot 为例)

1. 添加 Maven 依赖

<dependencies>
    <!-- PostgreSQL JDBC Driver -->
    <dependency>
        <groupId>org.postgresql</groupId>
        <artifactId>postgresql</artifactId>
        <version>42.5.4</version> <!-- 支持 PG 13 -->
    </dependency>

    <!-- openGauss JDBC Driver -->
    <dependency>
        <groupId>org.opengauss</groupId>
        <artifactId>opengauss-jdbc</artifactId>
        <version>6.0.3</version> <!-- 适配 openGauss 6.0.3 -->
    </dependency>

    <!-- Spring Boot JPA / JDBC -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-jdbc</artifactId>
    </dependency>
</dependencies>

:warning: 注意:不要使用 Maven 中带有 -og 后缀的非标准版本,而是明确指定 opengauss-jdbc 官方发布版本。若从私有仓库引入,请确认其内容包含 org.opengauss.Driver 而非 org.postgresql.Driver


2. 配置 application.yml

spring:
  datasource:
    postgres:
      url: jdbc:postgresql://localhost:5432/postgres_db
      username: pguser
      password: pgpass
      driver-class-name: org.postgresql.Driver

    opengauss:
      url: jdbc:opengauss://localhost:15400/og_db?sslMode=disable
      username: oguser
      password: ogpass
      driver-class-name: org.opengauss.Driver

3. 创建两个独立的数据源 Bean

@Configuration
public class DataSourceConfig {

    @Bean
    @ConfigurationProperties("spring.datasource.postgres")
    public DataSource postgresDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean
    @ConfigurationProperties("spring.datasource.opengauss")
    public DataSource opengaussDataSource() {
        return DataSourceBuilder.create().build();
    }

    // 可选:为每个数据源创建 JdbcTemplate
    @Bean
    public JdbcTemplate postgresJdbcTemplate(@Qualifier("postgresDataSource") DataSource ds) {
        return new JdbcTemplate(ds);
    }

    @Bean
    public JdbcTemplate opengaussJdbcTemplate(@Qualifier("opengaussDataSource") DataSource ds) {
        return new JdbcTemplate(ds);
    }
}

4. 使用时注入对应的数据源或 JdbcTemplate

@Service
public class DatabaseService {

    private final JdbcTemplate postgresTemplate;
    private final JdbcTemplate opengaussTemplate;

    public DatabaseService(
            @Qualifier("postgresJdbcTemplate") JdbcTemplate postgresTemplate,
            @Qualifier("opengaussJdbcTemplate") JdbcTemplate opengaussTemplate) {
        this.postgresTemplate = postgresTemplate;
        this.opengaussTemplate = opengaussTemplate;
    }

    public void queryFromPostgres() {
        List<String> result = postgresTemplate.queryForList(
            "SELECT name FROM users", String.class);
        System.out.println("PostgreSQL 数据: " + result);
    }

    public void queryFromOpenGauss() {
        List<String> result = opengaussTemplate.queryForList(
            "SELECT name FROM customers", String.class);
        System.out.println("openGauss 数据: " + result);
    }
}

:locked: 关键注意事项

项目 说明
驱动类名区分 - PostgreSQL 使用 org.postgresql.Driver
- openGauss 使用 org.opengauss.Driver :white_check_mark:
JAR 包来源 openGauss 官网 或中央仓库下载正确版本(如 opengauss-jdbc-6.0.3.jar),避免使用 Maven 上错误打包的版本(有些版本误含 PostgreSQL 类)
JDBC URL 前缀 - PostgreSQL: jdbc:postgresql://...
- openGauss: jdbc:opengauss://...
端口区分 openGauss 默认端口通常是 15400,而非 PostgreSQL 的 5432,注意配置正确
SSL 配置 若未启用 SSL,建议在连接串中添加 ?sslMode=disable 避免握手失败

:warning: 常见问题及解决方案

:cross_mark: 问题 1:类找不到 org.opengauss.Driver

原因:Maven 引入的 opengauss-jdbc 实际是 PostgreSQL 的副本(内部类为 org.postgresql.Driver)。

解决方案

  • 使用 官方发布的 JAR 包(从 openGauss 官网下载)
  • 或参考用户反馈:Maven 上传时会发布两个包,选择带有 -og 后缀的版本
<version>6.0.2-og</version> <!-- 特别标注“-og”的才是 opengauss 类路径 -->

:cross_mark: 问题 2:timestamp 类型解析异常

原因:早期版本 openGauss JDBC 驱动(如 6.0.2)在二进制模式下对 timestamptz 解析存在问题。

解决方案

  • 升级驱动至 OpenGauss JDBC Driver 6.0.36.1.0 Preview,已修复该问题。
  • 或在连接串中禁用二进制传输(临时方案):
jdbc:opengauss://...?binaryTransfer=false

:cross_mark: 问题 3:连接被重置(Connection reset)

可能原因

  • pg_hba.conf 未配置远程访问权限
  • 认证方式不匹配(如客户端使用 md5,服务端要求 sha256)

解决方案

  • 编辑 $GAUSSDATA/pg_hba.conf 添加:
    host all all 0.0.0.0/0 md5
    
  • 修改 $GAUSSDATA/postgresql.conf
    listen_addresses = '*'
    
  • 重启数据库生效

:puzzle_piece: 补充说明:openGauss 与 PostgreSQL 协议兼容性

  • openGauss 源自 PostgreSQL,协议大部分兼容,但已有扩展和差异。
  • 虽然 postgresql.jar 在某些场景下可连 openGauss(因其兼容性),但不推荐用于生产环境
  • 应始终使用 专用 opengauss JDBC 驱动 以确保功能完整,例如支持 B兼容模式dolphin 协议等。

:white_check_mark: 总结:最佳实践清单

步骤 操作
:white_check_mark: 使用不同 DataSource 配置两个数据库
:white_check_mark: 使用正确的驱动类:org.postgresql.Driverorg.opengauss.Driver
:white_check_mark: 选用 opengauss-jdbc 官方版本(建议 6.0.3+)
:white_check_mark: 配置独立的连接 URL、用户名、密码、端口
:white_check_mark: pg_hba.conf 中允许访问并重启数据库
:white_check_mark: 禁用二进制传输(必要时)或升级驱动解决 timestamp 问题

:blue_book: 参考链接

如有进一步需求(如 MyBatis 多数据源配置、事务隔离等),可继续提问。

建议在项目里面分别引入openGauss和PostgreSQL的驱动,pom里面如下图:

各自连接串如下:

2

4