PostgreSQL對接SequoiaDB

來源:互聯網
上載者:User

標籤:

PostgreSQL是一款開源的SQL資料庫,支援標準SQL,使用者可以通過JDBC驅動串連PostgreSQL進行應用程式開發。使用者通過 擴充PostgreSQL功能,讓開發人員可以使用SQL語句訪問SequoiaDB資料庫,完成SequoiaDB資料庫的增、刪、查、改操作。本文就針 對如何擴充PostgreSQL功能,實現PostgreSQL對接SequoiaDB進行介紹。

 

1 部署PostgreSQL

本教程為PostgreSQL與SequoiaDB的對接教程,所以作者建議使用者在sdbadmin使用者下(SequoiaDB資料庫預設使用者)安裝並使用PostgreSQL(本教程使用的PostgreSQL版本為9.3.4)。

1)源碼編譯PostgreSQL

下載連結: http://www.postgresql.org/ftp/source/

解壓後編譯安裝(需要root許可權)

$> tar -zxvf postgresql-9.3.4.tar.gz$> cd postgresql-9.3.4/$> ./configure && make && make install
2)切換使用者
$>su - sdbadmin
3)拷貝PostgreSQL檔案
$>cp -rf /usr/local/pgsql ~/
4)進入PostgreSQL目錄
$>cd pgsql

5)環境變數添加PostgreSQL的lib庫

$>export LD_LIBRARY_PATH=$(pwd)/lib:${LD_LIBRARY_PATH}

建議使用者將PostgreSQL的lib加到sdbadmin使用者的環境變數中,否則每次登陸sdbadmin使用PostgreSQL,都需要手工添加PostgreSQL的lib 到 LD_LIBRARY_PATH中

$> echo "export LD_LIBRARY_PATH=$(pwd)/lib:${LD_LIBRARY_PATH}" >> ~/.bash_profile
6)建立PostgreSQL的資料目錄
$>mkdir pg_data
7)初始化資料目錄(該操作只能操作一次)
$>bin/initdb -D pg_data/

 

1.2安裝SequoiaDB-PostgreSQL外掛程式

**1)

建立PostgreSQL的lib 目錄**

擷取PostgreSQL的libdir路徑

$> PGLIBDIR=$(bin/pg_config --libdir)

如果顯示的libdir目錄不存在,則需要使用者自己手工建立目錄

$> mkdir -p ${PGLIBDIR}

2)建立PostgreSQL的extension目錄

擷取PostgreSQL的sharedir路徑

$> PGSHAREDIR=$(bin/pg_config --sharedir)

在shardir目錄上再建立extemsion目錄

$> mkdir -p ${PGSHAREDIR}/extension

3)從SequoiaDB的安裝包中,拷貝PostgreSQL的擴充檔案

從SequoiaDB安裝後的postgresql目錄中拷貝sdb_fdw.so檔案到PostgreSQL的lib目錄,SequoiaDB預設安裝目錄為/opt/sequoiadb

$> cp -f /opt/sequoiadb/postgresql/sdb_fdw.so ${PGLIBDIR}

4)將sdb_fdw.control和sdb_fdw--1.0.sql指令碼拷貝到extension目錄中,兩個指令碼需要使用者手工編輯

$> cp -f sdb_fdw.control ${PGSHAREDIR}/extension/ ;$> cp -f sdb_fdw--1.0.sql ${PGSHAREDIR}/extension/ ;
sdb_fdw.control 指令碼內容
  # sdb_fdw extension    comment = ‘foreign data wrapper for SequoiaDB access‘    default_version = ‘1.0‘    module_pathname = ‘$libdir/sdb_fdw‘    relocatable = true
sdb_fdw--1.0.sql 指令碼內容
/* contrib/mongo_fdw/sdb_fdw--1.0.sql */-- complain if script is sourced in psql, rather than via CREATE EXTENSION\echo Use "CREATE EXTENSION sdb_fdw" to load this file. \quitCREATE FUNCTION sdb_fdw_handler()RETURNS fdw_handlerAS ‘MODULE_PATHNAME‘LANGUAGE C STRICT;CREATE FUNCTION sdb_fdw_validator(text[], oid)RETURNS voidAS ‘MODULE_PATHNAME‘LANGUAGE C STRICT;CREATE FOREIGN DATA WRAPPER sdb_fdwHANDLER sdb_fdw_handlerVALIDATOR sdb_fdw_validator;

 

1.3 部署PostgreSQL

1)

檢查連接埠是否被佔用

PostgreSQL預設啟動連接埠為”5432”,檢查連接埠是否被佔用(檢查操作建議使用root使用者操作,只有檢查連接埠需要root許可權,其餘操作還是需要在sdbadmin使用者下操作)

$>netstat -nap | grep 5432

如果5432連接埠被佔用或者希望修改PostgreSQL的啟動連接埠,則執行:

$> sed -i "s/#port = 5432/port = 11780/g" pg_data/postgresql.conf

2)啟動Postgresql服務進程(需要使用sdbadmin使用者執行以下命令)

$> bin/postgres -D pg_data/ >> logfile 2>&1 &

3)檢查PostgreSQL是否啟動成功

執行命令:

$> netstat -nap | grep 5432

結果為:

tcp   0   0 127.0.0.1:5432     0.0.0.0:*         LISTEN     20502/postgresunix  2   [ ACC ]   STREAM    LISTENING   40776754 20502/postgres     /tmp/.s.PGSQL.5432

4)建立PostgreSQL的database

$> bin/createdb -p 5432 foo

5)進入PostgreSQL shell 環境

$> bin/psql -p 5432 foo

2 PostgreSQL串連SequoiaDB

以下操作均在PostgreSQL shell 環境下執行

2.1 PostgreSQL與SequoiaDB建立關聯

1)載入SequoiaDB串連驅動

foo=# create extension sdb_fdw;

2)配置與SequoiaDB串連參數

foo=# create server sdb_server foreign data wrapper sdb_fdw options(address ‘192.168.30.182‘, service ‘11810‘, user ‘sdbadmin‘, password ‘cmbc123‘);

3)關聯SequoiaDB的集合空間與集合

註:集合空間與集合必須已經存在於SequoiaDB,否則查詢出錯。

預設情況下,表的欄位對應到SequoiaDB中為小寫字元,如果強制指定欄位為大寫字元,建立方式參考注意事項1

映射SequoiaDB 的數群組類型,建立方式參考注意事項2

foo=# create foreign table test (name text, id numeric) server sdb_server options ( collectionspace ‘chen‘, collection ‘test‘ ) ;

4)查詢
foo=# select * from test;
5)寫入資料
foo=# insert into test values(‘one‘,3);
6)更改資料
foo=# update test set id=9 where name=‘one‘;

7)查看所有的表(show tables;)

foo=# \d

8)查看錶的描述資訊

foo=# \d test
9)刪除表
foo=# drop foreign table test;

10)退出PostgreSQL shell環境

foo=# \q

 

2.2 使用須知

2.2.2 注意事項

1)注意字元的大小寫

SequoiaDB 中的集合空間、集合和欄位名均對字母的大小寫敏感

集合空間、集合名大寫

假設SequoiaDB 中存在名為TEST的集合空間,CHEN的集合,在PostgreSQL中建立相應的映射表

foo=# create foreign table sdb_upcase_cs_cl (name text) server sdb_server options ( collectionspace ‘TEST‘, collection ‘CHEN‘ ) ;
欄位名大寫

假設SequoiaDB 中存在名為foo的集合空間,bar的集合,而且儲存的資料為:

{ "_id": {   "$oid":"53a2a0e100e75e2c53000006" }, "NAME": "test"}

在PostgreSQL中建立相應的映射表

foo=# create foreign table sdb_upcase_field (“NAME” text) server sdb_server options ( collectionspace ‘foo‘, collection ‘bar‘ ) ;

執行查詢命令:

foo=# select * from sdb_upcase_field;

查詢結果為:

NAME------ test(1 rows)
2)映射SequoiaDB中的資料類型

假設SequoiaDB中存在foo集合空間,bar集合,儲存記錄為:

{ "_id": {    "$oid":"53a2de926b4715450a000001" }, "name": [   1,   2,   3 ], "id": 123}

在PostgreSQL 中建立相應的映射表

foo=# create foreign table bartest (name numeric[], id numeric) server sdb_server options ( collectionspace ‘foo‘, collection ‘bar‘ ) ;

執行查詢命令:

foo=# select * from bartest;

查詢結果:

 name  | id---------+-----{1,2,3} | 123
3)串連SequoiaDB 協調節點錯誤

如果PostgreSQL串連的SequoiaDB 協調節點重啟,在查詢時報錯

ERROR: Unable to get collection "chen.test", rc = -15HINT: Make sure the collectionspace and collection exist on the remote database

解決方案:

退出PostgreSQL shell

foo=# \q

重新進入PostgreSQL shell

$> bin/psql -p 5432 foo  

2.2.3 調整PostgreSQL設定檔

1)查看pg_shell中預設的配置

執行命令:

foo=#\set

結果為:

AUTOCOMMIT = ‘on‘PROMPT1 = ‘%/%R%# ‘PROMPT2 = ‘%/%R%# ‘PROMPT3 = ‘>> ‘VERBOSITY = ‘default‘VERSION = ‘PostgreSQL 9.3.4 on x86_64-unknown-linux-gnu, compiled by gcc (SUSE Linux) 4.3.4 [gcc-4_3-branch revision 152973], 64-bit‘DBNAME = ‘foo‘USER = ‘sdbadmin‘PORT = ‘5432‘ENCODING = ‘UTF8‘
2)調整pg_shell查詢時,每次擷取記錄數
foo=#\set FETCH_COUNT 100

調整為每次ps_shell每次擷取100 條記錄立即返回記錄,然後再繼續擷取。

直接在pg_shell中修改設定檔,只能在當前pg_shell中生效,重新登入pg_shell需要重新設定。

3)修改設定檔,調整pg_shell查詢時,每次擷取記錄數

執行命令:

$> ${PG_HOME}/bin/pg_config -sysconfdir

結果為:

/opt/sequoiadb/pgsql/etc

如果顯示目錄不存在,自己手動建立即可

$> mkdir -p /opt/sequoiadb/pgsql/etc

將需要修改的參數寫入設定檔中

$>echo "\\set FETCH_COUNT 100" >> /opt/sequoiadb/pgsql/etc/psqlrc
4)調整pg_shell的記錄層級
$>sed -i ‘s/#client_min_messages = notice/client_min_messages = debug1/g‘ pg_data/postgresql.conf
5)調整pg引擎的記錄層級
$>sed -i ‘s/#log_min_messages = warning/log_min_messages = debug1/g‘ pg_data/postgresql.conf

 

3 使用java用戶端串連PostgreSQL

1)修改PostgreSQL的監聽地址

$>sed -i "s/#listen_addresses = ‘localhost‘/listen_addresses = ‘0.0.0.0‘/g" pg_data/postgresql.conf
2)修改信任的機器列表
$>linenum=$(cat -n pg_data/pg_hba.conf | grep "# IPv4 local connections:" | awk ‘{print $1}‘); let "linenum=linenum+1";varStr="host   all            all            0.0.0.0/0              trust"; sed -i "${linenum} a${varStr}" pg_data/pg_hba.conf;
3)重啟PostgreSQL
$>bin/pg_ctl stop -s -D pg_data/ -m fast; bin/postgres -D pg_data/ >> logfile 2>&1 &
3.2 JDBC串連程式
package com.sequoiadb.sample;import java.sql.*;public class postgresql_sample {   static{     try {       Class.forName"org.postgresql.Driver");     } catch (ClassNotFoundException e) {       e.printStackTrace();     }   }   public static void main( String[] args ) throws SQLException{    String pghost = "192.168.30.182";    String port = "5432";    String databaseName = "foo";    // postgresql process is running in which user    String pgUser = "sdbadmin";    String url = "jdbc:postgresql://"+pghost+":"+port+"/" + databaseName;    Connection conn = DriverManager.getConnection(url, pgUser, null);    Statement stmt = conn.createStatement();    String sql = "select * from sdb_upcase_field ";    ResultSet rs = stmt.executeQuery(sql);    boolean isHeaderPrint = false;    while (rs.next()) {       ResultSetMetaData md = rs.getMetaData();       int col_num = md.getColumnCount();       if (isHeaderPrint){         for (int i = 1; i <= col_num; i++) {           System.out.print(md.getColumnName(i) + "|");           isHeaderPrint = true;         }       }       for (i = 1; i <= col_num; i++) {         System.out.print(rs.getString(i) + "|");       }       System.out.println();     }     stmt.close();     conn.close();   }}
  • 本文來自:Linux學習教程網

PostgreSQL對接SequoiaDB

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.