• Linux环境下的Java(JDBC)连接openGauss数据库实践


    一、测试环境:

    本实验预置环境

    1)操作系统版本:CentOS 7 64位(CentOS Linux release 7.6.1810)
    2)DataBase & JDBC版本:

    • openGauss 2.0.1。
    • JDBC驱动版本:JDBC_2.0.0
      官方下载地址:https://opengauss.org/zh/download/ (Tips:官方最新版本3.1.0)
      在这里插入图片描述

    3)JDK版本:Java 11.0.17
    登录网址:https://www.oracle.com/java/technologies/downloads/#java11
    选择对应jdk版本下载。
    在这里插入图片描述

    Tips:在Windows下载完成后,通过FTP工具上传到Linux上

    二、Linux环境安装Java环境及配置步骤

    1、登录到Linux环境,切换到root用户(Tips:需要root密码)

    su root
    
    • 1

    2、在usr目录下建立java安装目录

    cd /usr
    mkdir java
    
    • 1
    • 2

    3、将“jdk-11.0.17_linux-x64_bin.tar.gz” 上传到 /usr/java/ 目录 。(Tips:可通过FTP或者SSH 发送到Linux系统,在通过cp命令进行复制)

    4、解压jdk到当前目录,得到文件夹“jdk-11.0.17”(Tips:下载不同版本的JDK文件名不同)。

    cd /usr/java/ 
    tar -zxvf jdk-11.0.17_linux-x64_bin.tar.gz
    
    • 1
    • 2

    在这里插入图片描述

    5、安装完毕可以建立一个链接以节省目录长度

    ln -s /usr/java/jdk-11.0.17  /usr/jdk
    
    • 1

    6、编辑配置文件,配置环境变量
    vi /etc/profile
    在文本的末尾添加如下内容:

    export JAVA_HOME=/usr/jdk
    export CLASSPATH=$JAVA_HOME/lib/
    export PATH=$PATH:$JAVA_HOME/bin
    export PATH JAVA_HOME CLASSPATH
    
    • 1
    • 2
    • 3
    • 4

    cat /etc/profile
    在这里插入图片描述

    7、重启机器或执行命令

    source /etc/profile  
    或   
    sudo shutdown -r now
    
    • 1
    • 2
    • 3

    8、查看安装情况

    java -version
    
    • 1

    在这里插入图片描述

    可能出现的错误信息:
    bash: ./java: cannot execute binary file

    出现这个错误的原因可能是在32位的操作系统上安装了64位的jdk,
    1、查看jdk版本和Linux版本位数是否一致。
    2、查看你安装的Ubuntu是32位还是64位系统:

    sudo uname -m
    i686 //表示是32位
    x86_64 // 表示是64位

    到此, Java环境配置完成。

    三、准备链接数据库的环境

    1、修改数据库的pg_hba.conf文件。
    在GS_HOME中查找pg_hba.conf文件,本实验中数据库GS_HOME设置的为/gaussdb/data/db1,实际操作中GS_HOME地址可以查看安装时的配置文件
    “/soft/openGauss/clusterconfig.xml”中的

    cd /gaussdb/data/db1
    vi pg_hba.conf

    将以下内容添加进pg_hba.conf文件中。(Tips: 当在链接时如果提示“FATAL: Forbid remote connection with trust method!”,则需要更改目标IP对应的 客户端接入认证 将 trust 改成sha256)。
    在这里插入图片描述

    切换omm用户登录,使用gs_ctl命令将策略生效。

    su - omm
    gs_ctl reload -D /gaussdb/data/db1
    
    • 1
    • 2

    在这里插入图片描述

    2、连接数据库后,进入SQL命令界面。创建测试用户dbuser,密码为Gauss#3demo 。

    gsql -d postgres -p 26000 -r
    
    CREATE USER dbuser IDENTIFIED BY 'Gauss#3demo';
    
    postgres=# alter role dbuser createrole createdb;
    ALTER ROLE
    
    postgres=# \q
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    3、创建测试数据库demo。
    使用gsql工具登录数据库。登录用户为dbuser,密码为Gauss#3demo(或者为用户自定义的密码)。

    gsql -d postgres -p 26000 -U dbuser -r
    
    • 1

    创建数据库demo

    create database demo ENCODING 'UTF8' template = template0;
    \connect demo;
    
    • 1
    • 2

    4、创建名为demo的schema,并设置demo为当前的schema。

    CREATE SCHEMA demo;
    SET search_path TO demo;
    
    • 1
    • 2

    5、创建测试表websites。

    CREATE TABLE websites (
      id int NOT NULL,
      name char(20) NOT NULL DEFAULT '',
      url varchar(255) NOT NULL DEFAULT '',
      PRIMARY KEY (id)
    );
    COMMENT ON COLUMN websites.name IS '站点名称';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    6、插入数据。

    INSERT INTO websites VALUES 
    ('1', 'openGauss', 'https://opengauss.org/zh/'), 
    ('2', 'huaweicloud', 'https://www.huaweicloud.com/'), 
    ('3', 'openEuler', 'https://openeuler.org/zh/');
    
    • 1
    • 2
    • 3
    • 4

    7、退出数据库

    postgres=# \q
    
    • 1

    8、修改数据库监听地址。
    在GS_HOME中,本实验中数据库GS_HOME设置的为/gaussdb/data/db1。
    cd /gaussdb/data/db1
    vi postgresql.conf
    将listen_addresses的值修改成为*。
    listen_addresses = ‘*’
    修改完成后重启数据库生效(-D后面的数据库默认路径,需要根据实际情况进行修改)。
    gs_ctl restart -D /gaussdb/data/db1

    9、将对应的JDBC驱动包 “postgresql.jar” 上传到 /soft 目录 。(Tips:可通过FTP或者SSH 发送到Linux系统,在通过cp命令进行复制)。
    在这里插入图片描述

    到此, 链接数据库的环境准备就绪。

    四、连接测试

    1、连接openGauss并执行java代码
    1)使用Java程序连接数据库并进行查询。在/soft目录中创建openGaussDemo.java文件:
    vi /soft/openGaussDemo.java

    进入编辑openGaussDemo.java文件模式:
    i
    将如下文件内容拷贝至openGaussDemo.java文件。

    import java.sql.*; 
    public class openGaussDemo {
     
        static final String JDBC_DRIVER = "org.postgresql.Driver";  
        static final String DB_URL = "jdbc:postgresql://192.168.2.3:26000/demo";
          // 数据库的用户名与密码,需要根据自己的设置
        static final String USER = "dbuser";
        static final String PASS = "Gauss#3demo";
         public static void main(String[] args) {
            Connection conn = null;
            Statement stmt = null;
            try{
                // 注册 JDBC 驱动
                Class.forName(JDBC_DRIVER);
            
                // 打开链接
                System.out.println("连接数据库...");
                conn = DriverManager.getConnection(DB_URL,USER,PASS);
            
                // 执行查询
                System.out.println(" 实例化Statement对象...");
                stmt = conn.createStatement();
                String sql;
                sql = "SELECT id, name, url FROM demo.websites";
                ResultSet rs = stmt.executeQuery(sql);
            
                // 展开结果集数据库
                while(rs.next()){
                    // 通过字段检索
                    int id  = rs.getInt("id");
                    String name = rs.getString("name");
                    String url = rs.getString("url");
        
                    // 输出数据
                    System.out.print("ID: " + id);
                    System.out.print(", 站点名称: " + name);
                    System.out.print(", 站点 URL: " + url);
                    System.out.print("\n");
                }
                // 完成后关闭
                rs.close();
                stmt.close();
                conn.close();
            }catch(SQLException se){
                // 处理 JDBC 错误
                se.printStackTrace();
            }catch(Exception e){
                // 处理 Class.forName 错误
                e.printStackTrace();
            }finally{
                // 关闭资源
                try{
                    if(stmt!=null) stmt.close();
                }catch(SQLException se2){
                }// 什么都不做
                try{
                    if(conn!=null) conn.close();
                }catch(SQLException se){
                    se.printStackTrace();
                }
            }
            System.out.println("Goodbye!");
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64

    编辑完成后,按“ESC”键,输入:wq!保存退出。
    说明:请用户根据实际情况替换红字内容,修改
    jdbc:postgresql://192.168.2.3:26000/postgres中的IP信息,以及连接数据库的用户及密码USER = “dbuser”、 PASS = “Gauss#3demo” 。

    2、在安装Java的本机,对Java程序编译后执行。
    先对Java程序进行编译(进入Java程序的目录)
    javac -encoding utf-8 -cp /soft/postgresql.jar openGaussDemo.java

    再执行以下命令(Tips:注意“.:”的书写)。
    java -cp .:/soft/postgresql.jar openGaussDemo

    3、执行结果
    在这里插入图片描述

    至此,在linux环境下java访问openGauss数据库就算完成了。

    五、经验小结(FAQ

    1、数据库运行环境建议

    1)支持的硬件平台
    openGauss支持运行在ARM服务器和通用的x86服务器上:

    支持ARM服务器和基于x86_64的通用PC服务器。
    支持本地存储(SATA、SAS、SSD)。
    支持千兆、万兆Ethernet网络。

    2)支持的操作系统
    ARM:openEuler 20.03LTS(推荐采用此操作系统)、麒麟V10、Asianux 7.5
    X86:openEuler 20.03LTS、CentOS 7.6、Asianux 7.6

    2、JDBC开发应用程序的流程

    在这里插入图片描述

    3、连接故障说明

    1)gsql: could not connect to server: No route to host
    此问题一般是指定了不可达的地址或者端口导致的。请检查-h参数与-p参数是否添加正确。

    2)gsql: FATAL: Invalid username/password,login denied.
    此问题一般是输入了错误的用户名和密码导致的,请联系数据库管理员,确认用户名和密码的正确性。

    3)gsql: FATAL: Forbid remote connection with trust method!
    数据库由于安全问题,禁止远程登录时使用trust模式。这时需要修改pg_hba.conf里的连接认证信息。具体的设置信息请参见:官方《开发者指南》中“管理数据库安全 > 客户端接入认证 > 配置文件参考”章节。 ——实验过程中遇到此错误tips

    说明:请不要修改pg_hba.conf中openGauss主机的相关设置,否则可能导致数据库功能故障。建议业务应用部署在openGauss之外,而非openGauss内部。

    4)The “libpq.so” loaded mismatch the version of gsql, please check it.
    此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的,请通过“ldd gsql”命令确认当前加载的libpq.so的版本,并通过修改LD_LIBRARY_PATH环境变量来加载正确的libpq.so。

    5)gsql: symbol lookup error: xxx/gsql: undefined symbol: libpqVersionString
    此问题是由于环境中使用的libpq.so的版本与gsql的版本不匹配导致的(也有可能是环境中存在PostgreSQL的libpq.so),请通过“ldd gsql”命令确认当前加载的libpq.so的版本,并通过修改LD_LIBRARY_PATH环境变量来加载正确的libpq.so。

    6)gsql: connect to server failed: Connection timed out
    Is the server running on host “xx.xxx.xxx.xxx” and accepting TCP/IP connections on port xxxx?
    此问题是由于网络连接故障造成。请检查客户端与数据库服务器间的网络连接。如果发现从客户端无法PING到数据库服务器端,则说明网络连接出现故障。

    7)gsql: FATAL: permission denied for database “postgres” DETAIL: User does not have CONNECT privilege.

    此问题是由于用户不具备访问该数据库的权限,可以使用如下方法解决。
    a.使用管理员用户dbadmin连接数据库。
    gsql -d postgres -U dbadmin -p 5432

    b.赋予该用户访问数据库的权限。
    GRANT CONNECT ON DATABASE postgres TO user1;

    8)gsql: FATAL: sorry, too many clients already,active/non-active: 197⁄3.
    此问题是由于系统连接数量超过了最大连接数量。请进行会话连接数管理,释放无用会话。
    会话状态可以在视图PG_STAT_ACTIVITY中查看。无用会话可以使用函数pg_terminate_backend进行释放。

    select datid,pid,state from pg_stat_activity;
    datid | pid | state -------±----------------±------- 13205 | 139834762094352 | active 13205 | 139834759993104 | idle (2 rows)

    其中pid的值即为该会话的线程ID。根据线程ID结束会话。
    SELECT PG_TERMINATE_BACKEND(139834759993104);

    显示类似如下信息,表示结束会话成功。
    PG_TERMINATE_BACKEND ---------------------- t (1 row)

    9)gsql: wait xxx.xxx.xxx.xxx:xxxx timeout expired
    gsql在向数据库发起连接的时候,会有5分钟超时机制,如果在这个超时时间内,数据库未能正常的对客户端请求进行校验和身份认证,那么gsql会退出当前会话的连接过程,并报出如上错误。
    一般来说,此问题是由于连接时使用的-h参数及-p参数指定的连接主机及端口有误(即错误信息中的xxx部分),导致通信故障;极少数情况是网络故障导致。要排除此问题,请检查数据库的主机名及端口是否正确。

    10)gsql: could not receive data from server: Connection reset by peer.
    同时,检查数据库主节点日志中出现类似如下日志“ FATAL: cipher file “/data/dbnode/server.key.cipher” has group or world access”,一般是由于数据目录或部分关键文件的权限被误操作篡改导致。请参照其他正常实例下的相关文件权限,修改回来便可。

    11)gsql: FATAL: GSS authentication method is not allowed because XXXX user password is not disabled.
    目标数据库主节点的pg_hba.conf里配置了当前客户端IP使用”gss”方式来做认证,该认证算法不支持用作客户端的身份认证,请修改到”sha256”后再试。配置方法见官网《开发者指南》中“管理数据库安全 > 客户端接入认证 > 配置文件参考”章节 。

    说明:

    • 请不要修改pg_hba.conf中openGauss主机的相关设置,否则可能导致数据库功能故障。
    • 建议业务应用部署在openGauss之外,而非openGauss内部。

    以上欢迎大家测试、并交流!

    🍒如果您觉得博主的文章还不错或者有帮助的话,请关注一下博主,如果三连点赞评论收藏就更好啦!谢谢各位大佬给予的支持!

  • 相关阅读:
    189. 轮转数组
    Java基于SpringBoot的校园疫情防控系统
    python----23-集合
    数据库实验一 数据表的创建与修改管理
    【数学分析笔记05】数列极限的性质
    Rust数据类型——初学者指南
    2.YOLOv1
    Spring Boot虚拟线程与Webflux在JWT验证和MySQL查询上的性能比较
    Java 拦截器
    Python学习基础笔记三——字符串
  • 原文地址:https://blog.csdn.net/GaussDB/article/details/127881258