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

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

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

前情提要,jdk版本1.8

PostgreSQL:华为云openGauss数据库指导实验-PostgreSQL文档类资源-CSDN下载PostgreSQL:华为云openGauss数据库指导实验更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/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的博客-CSDN博客创建华为云数据库那部分看实验指导书首先下载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.csdn.net/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也是有的

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值