基于java研发的系统,之前一直用的postgresql13
目前有部分新业务需要基于opengauss6.0.3进行研发
因此,应用中有一段时间需要同时连接pg13和gs6
请教java中如何配置,能实现同时多数据源,一个数据源连接pg13,一个数据源连接gs6
谢谢。
基于java研发的系统,之前一直用的postgresql13
目前有部分新业务需要基于opengauss6.0.3进行研发
因此,应用中有一段时间需要同时连接pg13和gs6
请教java中如何配置,能实现同时多数据源,一个数据源连接pg13,一个数据源连接gs6
谢谢。
答案内容由AI生成,仅供参考:
| 步骤 | 操作 |
|---|---|
使用不同 DataSource 配置两个数据库 |
|
使用正确的驱动类:org.postgresql.Driver 和 org.opengauss.Driver |
|
选用 opengauss-jdbc 官方版本(建议 6.0.3+) |
|
| 配置独立的连接 URL、用户名、密码、端口 | |
在 pg_hba.conf 中允许访问并重启数据库 |
|
| 禁用二进制传输(必要时)或升级驱动解决 timestamp 问题 |
在基于 Java 的系统中,如果需要在同一应用中同时连接 PostgreSQL 13 和 openGauss 6.0.3,可以通过 多数据源配置(Multiple Data Sources) 实现。以下是详细的配置方案与最佳实践,确保驱动兼容、类路径无冲突,并支持稳定运行。
使用两个不同的 JDBC 驱动:
postgresql JDBC 驱动(org.postgresql.Driver)。opengauss-jdbc 驱动(org.opengauss.Driver)。使用 独立的数据源(DataSource) 分别配置两个数据库连接。
避免 JAR 包冲突:避免使用错误版本或混用类路径。
推荐使用 Spring Boot 框架进行多数据源管理,便于集成和维护。
<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>
注意:不要使用 Maven 中带有
-og后缀的非标准版本,而是明确指定opengauss-jdbc官方发布版本。若从私有仓库引入,请确认其内容包含org.opengauss.Driver而非org.postgresql.Driver。
application.ymlspring:
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
@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);
}
}
@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);
}
}
| 项目 | 说明 |
|---|---|
| 驱动类名区分 | - PostgreSQL 使用 org.postgresql.Driver- openGauss 使用 org.opengauss.Driver |
| 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 避免握手失败 |
org.opengauss.Driver原因:Maven 引入的
opengauss-jdbc实际是 PostgreSQL 的副本(内部类为org.postgresql.Driver)。
解决方案:
- 使用 官方发布的 JAR 包(从 openGauss 官网下载)
- 或参考用户反馈:Maven 上传时会发布两个包,选择带有
-og后缀的版本<version>6.0.2-og</version> <!-- 特别标注“-og”的才是 opengauss 类路径 -->
原因:早期版本 openGauss JDBC 驱动(如 6.0.2)在二进制模式下对
timestamptz解析存在问题。
解决方案:
- 升级驱动至 OpenGauss JDBC Driver 6.0.3 或 6.1.0 Preview,已修复该问题。
- 或在连接串中禁用二进制传输(临时方案):
jdbc:opengauss://...?binaryTransfer=false
可能原因:
pg_hba.conf未配置远程访问权限- 认证方式不匹配(如客户端使用 md5,服务端要求 sha256)
解决方案:
- 编辑
$GAUSSDATA/pg_hba.conf添加:host all all 0.0.0.0/0 md5- 修改
$GAUSSDATA/postgresql.conf:listen_addresses = '*'- 重启数据库生效
postgresql.jar 在某些场景下可连 openGauss(因其兼容性),但不推荐用于生产环境。B兼容模式、dolphin 协议等。| 步骤 | 操作 |
|---|---|
使用不同 DataSource 配置两个数据库 |
|
使用正确的驱动类:org.postgresql.Driver 和 org.opengauss.Driver |
|
选用 opengauss-jdbc 官方版本(建议 6.0.3+) |
|
| 配置独立的连接 URL、用户名、密码、端口 | |
在 pg_hba.conf 中允许访问并重启数据库 |
|
| 禁用二进制传输(必要时)或升级驱动解决 timestamp 问题 |
参考链接
如有进一步需求(如 MyBatis 多数据源配置、事务隔离等),可继续提问。