springboot+jpa链接华为云GaussDB(for openGauss)

本文档记录了尝试使用SpringBoot连接华为云GaussDB(for openGauss)时遇到的SCRAM认证错误,并详细解析了错误原因和解决步骤。关键在于使用华为云提供的JDBC驱动,避免引入官方的postgresql依赖,最终成功建立连接。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前情提要,jdk版本1.8

PostgreSQL:华为云openGauss数据库指导实验-PostgreSQL文档类资源-优快云下载PostgreSQL:华为云openGauss数据库指导实验更多下载资源、学习资料请访问优快云下载频道.https://download.youkuaiyun.com/download/weixin_48456383/85087050下面进入正题:

首先讲讲我的报错吧

正常springboot-jpa链接数据库只需要JDBC,JPA,对应的数据库驱动依赖就行了。我一开始也是这么想的。下面是我的辛酸史!

首先华为云云端提供了DAS服务可以通过和链接postgresql一样的方式去链接它的openGauss。并且华为云提供了postgresql的jdbc驱动程序。所以理论上,springboot是可以链接华为GaussDB(for openGauss)。

华为云jdbc驱动包如下

https://dbs-download.obs.cn-north-1.myhuaweicloud.com/rds/GaussDB_opengauss_client_tools.ziphttps://dbs-download.obs.cn-north-1.myhuaweicloud.com/rds/GaussDB_opengauss_client_tools.zip

单纯只是jdbc链接的话可以参考我这一篇博客

Jdbc连接华为云GaussDB(for openGauss)_奶奶滴,为什么不学java的博客-优快云博客创建华为云数据库那部分看实验指导书首先下载GaussDB(for openGauss)的驱动https://dbs-download.obs.cn-north-1.myhuaweicloud.com/rds/GaussDB_opengauss_client_tools.ziphttps://dbs-download.obs.cn-north-1.myhuaweicloud.com/rds/GaussDB_opengauss_client_tools.zip下载完之后找到jdbc对应的jar.https://blog.youkuaiyun.com/weixin_48456383/article/details/124004119

首先我在IDEA新建一个springboot的项目,我勾选了spring web,spring jpa,spring postgresql,spring jdbc的依赖。然后把华为云提供的jdbc的驱动包导入到项目中,不会导入看我上面的一篇博客,进入项目中,我的pom.xml配置文件如下

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo1</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo1</name>
    <description>demo1</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

理所当然没什么错

然后配置application.properties,看起来没什么问题

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://121.36.92.254:8000/lmx?currentSchema=root
spring.datasource.username=root
spring.datasource.password=Zz457178918

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

server.port=8080

运行报错
org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.jdbc.env.spi.JdbcEnvironment]

然后看网上的解释是要配置文件加上这样一句,指明jpa的database

spring.jpa.database=postgresql

加完之后有报错

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'entityManagerFactory' defined in class path resource [org/springframework/boot/autoconfigure/orm/jpa/HibernateJpaConfiguration.class]: Invocation of init method failed; nested exception is javax.persistence.PersistenceException: [PersistenceUnit: default] Unable to build Hibernate SessionFactory; nested exception is org.hibernate.exception.JDBCConnectionException: Unable to open JDBC Connection for DDL execution

再查查说是要加这个

spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect

都改完了之后,大的来了,报这个错,这我就摸不清了啊

org.postgresql.util.PSQLException: Invalid or unsupported by client SCRAM mechanisms

上华为云查了一下还真有这个的纠错,脑补一下

你应该知道的数仓安全——安全认证-云社区-华为云安全认证是识别用户身份并允许用户登录的过程,是用户使用数据库的第一步。用户可以通过口令认证、LDAP认证、IAM认证等方式实现身份认证并登录数据库。介绍了...https://bbs.huaweicloud.com/blogs/249702他给了纠错链接,但是404,我真的tm!

然后就一直卡着,不会啊这个SCRAM协议。

然后看报错是我忽然发现他报的错不是来自于华为云给的jdbc得那个jar包

它来自于我导入得官方给的 postgresql得jar包依赖得报错。到这里我豁然开朗,我既然有了华为的postgresql得jdbc驱动,为啥还要导入spring官方给的呢?我是猪@_@

下面是正确的链接方式

正解

新建springboot项目勾选了spring web,spring jpa,spring jdbc的依赖。切记不要用官方给的

postgresql的依赖

你的pom.xml文件应该长这样

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.6</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.example</groupId>
    <artifactId>demo2</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>demo2</name>
    <description>demo2</description>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

导入之前华为云给的jdbc的驱动包

配置applications.propertites

spring.datasource.driver-class-name=org.postgresql.Driver
spring.datasource.url=jdbc:postgresql://121.36.92.254:8000/lmx?currentSchema=root
spring.datasource.username=root
spring.datasource.password=Zz457178918

spring.jpa.database=postgresql
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.properties.hibernate.hbm2ddl.auto=create
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
server.port=8080

简单写一个测试类

import org.hibernate.annotations.Proxy;

import javax.persistence.*;
import java.sql.Date;
@Proxy(lazy = false)
@Entity
@Table(name = "t_user")
public class User {

    @Id
    @GeneratedValue
    private  Long id;

    private String nickname;
    private String username;
    private String password;
    private String email;
    private  String avatar;
    private Integer type;


    public User() {
    }




    @Override
    public String toString() {
        return "User{" +
                "id=" + id +
                ", nickname='" + nickname + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", email='" + email + '\'' +
                ", avatar='" + avatar + '\'' +
                ", type=" + type +
                '}';
    }

    public void setId(Long id) {
        this.id = id;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public void setAvatar(String avatar) {
        this.avatar = avatar;
    }

    public void setType(Integer type) {
        this.type = type;
    }


    public Long getId() {
        return id;
    }

    public String getNickname() {
        return nickname;
    }

    public String getUsername() {
        return username;
    }

    public String getPassword() {
        return password;
    }

    public String getEmail() {
        return email;
    }

    public String getAvatar() {
        return avatar;
    }

    public Integer getType() {
        return type;
    }


}

连接正常,完全跑通,通过jpa新建的t_user也是有的

<think>好的,用户想在Spring Boot中集成GaussDB,我需要提供配置或集成方法。首先,我得回忆一下Spring Boot集成数据库的一般步骤,通常是通过配置数据源和依赖。GaussDB是华为的数据库,可能和PostgreSQL兼容,所以可能需要使用PostgreSQL的驱动。用户之前提到过使用Spring Boot和MySQL,现在换成GaussDB,可能需要调整依赖和配置。首先,确定GaussDB的JDBC驱动是否可用。华为可能有自己的驱动jar,或者推荐使用PostgreSQL的驱动,因为GaussDB兼容PostgreSQL协议。然后,在pom.xml中添加对应的依赖。如果是PostgreSQL兼容,可能需要添加postgresql的依赖。例如:```xml<dependency><groupId>org.postgresql</groupId><artifactId>postgresql</artifactId><version>42.3.3</version></dependency> ```或者,如果华为提供了自己的驱动,可能需要手动安装或者从Maven仓库获取。比如华为的GaussDB驱动可能对应的groupId和artifactId不同,需要用户查阅文档。接下来是配置application.properties或application.yml。数据源的URL、用户名、密码需要指向GaussDB的实例。例如:```spring.datasource.url=jdbc:postgresql://localhost:5432/gaussdbspring.datasource.username=your-usernamespring.datasource.password=your-passwordspring.datasource.driver-class-name=org.postgresql.Driver``` 如果使用华为的特定驱动,driver-class-name需要相应调整,比如com.huawei.gaussdb.jdbc.Driver。 然后,可能需要配置JPA或者MyBatis等持久层框架。这部分和平时使用SpringBoot一样,比如JPA的配置: ```spring.jpa.hibernate.ddl-auto=updatespring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect``` 不过,如果GaussDB有自定义的方言,可能需要扩展Hibernate的Dialect类,或者使用华为提供的方言。 另外,用户可能需要处理连接池配置,比如HikariCP的参数,如最大连接数、超时时间等。这部分通常在application.properties里设置。 还有事务管理,Spring Boot默认使用声明式事务,可能不需要额外配置,除非有特殊需求。 测试连接是否成功,可以编写一个简单的JPA实体和Repository,或者使用JdbcTemplate执行一个查询,比如SELECT1,来验证数据库连接是否正常。 如果用户遇到驱动问题,可能需要检查依赖是否正确,或者驱动类是否在类路径中。此外,GaussDB可能有特定的SSL配置或者网络要求,需要用户根据实际环境调整连接参数。总结一下,步骤大致是:添加依赖、配置数据源、配置持久层框架、测试连接。需要注意的是GaussDB的兼容性,如果完全兼容PostgreSQL,那么使用PostgreSQL的驱动和配置即可;否则可能需要使用华为提供的特定驱动和配置。另外,用户可能想知道如何验证是否集成成功,可以建议他们编写一个简单的测试用例,或者检查启动日志是否有数据库连接的报错。如果有问题,可能需要检查网络连接、权限设置、驱动版本等。 最后,相关问题可以涉及性能优化、连接池配置、事务管理,或者与MySQL的对比,迁移注意事项等。</think>### Spring Boot集成GaussDB的方法 在Spring Boot中集成GaussDB,需通过**JDBC驱动配置**和**数据源管理**实现。以下是具体步骤: --- #### 1. **添加GaussDB驱动依赖** GaussDB兼容PostgreSQL协议,可直接使用PostgreSQL驱动。在`pom.xml`中添加: ```xml <dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.3.3</version> </dependency> ``` 若需华为官方驱动(如GaussDB for openGauss),需从华为仓库下载并手动安装[^1]。 --- #### 2. **配置数据源** 在`application.properties`中配置数据库连接: ```properties # 基础配置 spring.datasource.url=jdbc:postgresql://{IP}:{PORT}/{DB_NAME} spring.datasource.username=your_username spring.datasource.password=your_password spring.datasource.driver-class-name=org.postgresql.Driver # 连接池优化(HikariCP) spring.datasource.hikari.maximum-pool-size=20 spring.datasource.hikari.connection-timeout=30000 ``` --- #### 3. **配置JPA/Hibernate** 若使用JPA,需指定方言: ```properties spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect spring.jpa.hibernate.ddl-auto=update ``` 若GaussDB有自定义语法,需扩展`PostgreSQLDialect`类。 --- #### 4. **验证连接** 编写测试接口或单元测试: ```java @Autowired private DataSource dataSource; @Test void testConnection() throws SQLException { try (Connection conn = dataSource.getConnection()) { assertTrue(conn.isValid(5)); } } ``` --- #### 5. **事务管理** 使用`@Transactional`注解声明事务: ```java @Service public class VehicleService { @Transactional public void addVehicle(Vehicle entity) { // 数据库操作 } } ``` --- ### 常见问题解决 1. **驱动不兼容**:检查GaussDB版本与驱动匹配性,或联系华为获取定制驱动[^1]。 2. **连接超时**:调整连接池参数或检查网络策略。 3. **方言错误**:根据日志调整`database-platform`配置。 ---
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值