一、測試環境
1、操作系統:
CentOS操作系統官方下載地址:https://www.centos.org/download/?
(Tips:目前官方版本已經到8、9)
2、DataBase版本:
根據操作系統下載匹配的數據庫版本和JDBC驅動包。
官方下載地址:https://opengauss.org/zh/download/??(Tips:官方最新版本3.1.0)
3、JDK版本:
登錄網址:https://www.oracle.com/java/technologies/downloads/#java11?
選擇對應jdk版本下載。(Tips:可在Windows下載完成后,通過FTP或者SSH到發送到Linux上)。
4、本實驗預置環境
1)操作系統版本:CentOS 7 64位(CentOS Linux release 7.6.1810)
2)DataBase?&?JDBC版本:
üopenGauss 2.0.1。??
üJDBC驅動版本:JDBC_2.0.0
3)JDK版本:Java 11.0.17
二、Linux環境安裝Java環境及配置步驟
1、登錄到Linux環境,切換到root用戶(Tips:需要root密碼)
?
su root
?
2、在usr目錄下建立java安裝目錄
?
cd /usr mkdir java
?
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
?
5、安裝完畢可以建立一個鏈接以節省目錄長度
?
ln -s /usr/java/jdk-11.0.17 /usr/jdk
?
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 cat /etc/profile
?
7、重啟機器或執行命令
?
source /etc/profile ?
?
或???
?
sudo shutdown -r now
?
8、查看安裝情況
?
java -version
?
9、可能出現的錯誤信息:
?
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
?
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
?
3、創建測試數據庫demo。
使用gsql工具登陸數據庫。登錄用戶為dbuser,密碼為Gauss#3demo(或者為用戶自定義的密碼)。
?
gsql -d postgres -p 26000 -U dbuser –r
?
創建數據庫demo
?
create database demo ENCODING 'UTF8' template = template0; connect demo;
?
4、創建名為demo的schema,并設置demo為當前的schema。
?
CREATE SCHEMA demo;
?
將默認搜索路徑設為demo。
?
SET search_path TO demo;
?
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 '站點名稱';
?
6、插入數據。
?
INSERT INTO websites VALUES ('1', 'openGauss', 'https://opengauss.org/zh/'), ('2', 'huaweicloud', 'https://www.huaweicloud.com/'), ('3', 'openEuler', 'https://openeuler.org/zh/');
?
7、退出數據庫
?
postgres=# q
?
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//192.168.52.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(" "); } // 完成后關閉 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!"); } }
?
編輯完成后,按“ESC”鍵,輸入:wq!保存退出。
說明:請用戶根據實際情況替換紅字內容,修改
jdbc//192.168.52.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服務器。
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內部。
以上歡迎大家測試、并交流!
審核編輯:湯梓紅
評論
查看更多