微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

PostgreSQL对接SequoiaDB

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-zxvfpostgresql-9.3.4.tar.gz
$>cdpostgresql-9.3.4/
$>./configure&&make&&makeinstall

2)切换用户

$>su-sdbadmin

3)拷贝Postgresql文件

$>cp-rf/usr/local/pgsql~/

4)进入Postgresql目录

$>cdpgsql

5)环境变量添加Postgresql的lib库

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

建议用户将Postgresql的lib加到sdbadmin用户的环境变量中,否则每次登陆sdbadmin使用Postgresql,都需要手工添加Postgresql的lib 到 LD_LIBRARY_PATH中

$>echo"exportLD_LIBRARY_PATH=$(pwd)/lib:${LD_LIBRARY_PATH}">>~/.bash_profile

6)创建Postgresql的数据目录

$>mkdirpg_data

7)初始化数据目录(该操作只能操作一次)

$>bin/initdb-Dpg_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-fsdb_fdw.control${PGSHAREDIR}/extension/;
$>cp-fsdb_fdw--1.0.sql${PGSHAREDIR}/extension/;

sdb_fdw.control 脚本内容

#sdb_fdwextension
comment='foreigndatawrapperforSequoia@R_830_4044@'
default_version='1.0'
module_pathname='$libdir/sdb_fdw'
relocatable=true

sdb_fdw--1.0.sql 脚本内容

/*contrib/mongo_fdw/sdb_fdw--1.0.sql*/
--complainifscriptissourcedinpsql,ratherthanviaCREATEEXTENSION
\echoUse"CREATEEXTENSIONsdb_fdw"toloadthisfile.\quit
CREATEFUNCTIONsdb_fdw_handler()
RETURNSfdw_handler
AS'MODULE_PATHNAME'
LANGUAGECSTRICT;
CREATEFUNCTIONsdb_fdw_validator(text[],oid)
RETURNSvoid
AS'MODULE_PATHNAME'
LANGUAGECSTRICT;
CREATEFOREIGNDATAWRAPPERsdb_fdw
HANDLERsdb_fdw_handler
VALIDATORsdb_fdw_validator;

1.3 部署Postgresql

1)

检查端口是否被占用

Postgresql认启动端口为”5432”,检查端口是否被占用(检查操作建议使用root用户操作,只有检查端口需要root权限,其余操作还是需要在sdbadmin用户下操作)

$>netstat-nap|grep5432

如果5432端口被占用或者希望修改Postgresql的启动端口,则执行:

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

2)启动Postgresql服务进程(需要使用sdbadmin用户执行以下命令)

$>bin/postgres-Dpg_data/>>logfile2>&1&

3)检查Postgresql是否启动成功

执行命令:

$>netstat-nap|grep5432

结果为:

tcp00127.0.0.1:54320.0.0.0:*LISTEN20502/postgres
unix2[ACC]STREAMLISTENING4077675420502/postgres/tmp/.s.PGsql.5432

4)创建Postgresql的database

$>bin/createdb-p5432foo

5)进入Postgresqlshell环境

$>bin/psql-p5432foo

2 Postgresql连接SequoiaDB

以下操作均在Postgresql shell 环境下执行

2.1 Postgresql与SequoiaDB建立关联

1)加载SequoiaDB连接驱动

foo=#createextensionsdb_fdw;

2)配置与SequoiaDB连接参数

foo=#createserversdb_serverforeigndatawrappersdb_fdwoptions(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*fromtest;

5)写入数据

foo=#insertintotestvalues('one',3);

6)更改数据

foo=#updatetestsetid=9wherename='one';

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

foo=#\d

8)查看表的描述信息

foo=#\dtest

9)删除

foo=#dropforeigntabletest;

10)退出Postgresql shell环境

foo=#\q

2.2 使用须知

编程之家

2.2.2 注意事项

1)注意字符的大小写

SequoiaDB 中的集合空间、集合和字段名均对字母的大小写敏感

集合空间、集合名大写

假设SequoiaDB 中存在名为TEST的集合空间,CHEN的集合,在Postgresql中建立相应的映射表

foo=#createforeigntablesdb_upcase_cs_cl(nametext)serversdb_serveroptions(collectionspace'TEST',collection'CHEN');

字段名大写

假设SequoiaDB 中存在名为foo的集合空间,bar的集合,而且保存的数据为:

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

在Postgresql中建立相应的映射表

foo=#createforeigntablesdb_upcase_field(“NAME”text)serversdb_serveroptions(collectionspace'foo',collection'bar');

执行查询命令:

foo=#select*fromsdb_upcase_field;

查询结果为:

NAME
------
test
(1rows)

2)映射SequoiaDB中的数据类型

假设SequoiaDB中存在foo集合空间,bar集合,保存记录为:

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

在Postgresql 中建立相应的映射表

foo=#createforeigntablebartest(namenumeric[],idnumeric)serversdb_serveroptions(collectionspace'foo',collection'bar');

执行查询命令:

foo=#select*frombartest;

查询结果:

name|id
---------+-----
{1,3}|123

3)连接SequoiaDB 协调节点错误

如果Postgresql连接的SequoiaDB 协调节点重启,在查询时报错

ERROR:Unabletogetcollection"chen.test",rc=-15
HINT:Makesurethecollectionspaceandcollectionexistontheremotedatabase

解决方法

退出Postgresql shell

foo=#\q

重新进入Postgresql shell

$>bin/psql-p5432foo

2.2.3 调整Postgresql配置文件

1)查看pg_shell中认的配置

执行命令:

foo=#\set

结果为:

AUTOCOMMIT='on'
PROMPT1='%/%r%#'
PROMPT2='%/%r%#'
PROMPT3='>>'
VERBOSITY='default'
VERSION='Postgresql9.3.4onx86_64-unkNown-linux-gnu,compiledbygcc(SUSELinux)4.3.4[gcc-4_3-branchrevision152973],64-bit'
dbnAME='foo'
USER='sdbadmin'
PORT='5432'
ENCODING='UTF8'

2)调整pg_shell查询时,每次获取记录数

foo=#\setFETCH_COUNT100

调整为每次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"\\setFETCH_COUNT100">>/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-npg_data/pg_hba.conf|grep"#IPv4localconnections:"|awk'{print$1}');\
let"linenum=linenum+1";varStr="hostallall0.0.0.0/0trust";\
sed-i"${linenum}a${varStr}"pg_data/pg_hba.conf;

3)重启Postgresql

$>bin/pg_ctlstop-s-Dpg_data/-mfast;bin/postgres-Dpg_data/>>logfile2>&1&

3.2 JDBC连接程序

packagecom.sequoiadb.sample;
importjava.sql.*;
publicclasspostgresql_sample{
static{
try{
Class.forName"org.postgresql.Driver");
}catch(ClassNotFoundExceptione){
e.printstacktrace();
}
}
publicstaticvoidmain(String[]args)throwssqlException{
Stringpghost="192.168.30.182";
Stringport="5432";
StringdatabaseName="foo";
//postgresqlprocessisrunninginwhichuser
StringpgUser="sdbadmin";
Stringurl="jdbc:postgresql://"+pghost+":"+port+"/"+databaseName;
Connectionconn=DriverManager.getConnection(url,pgUser,null);
Statementstmt=conn.createStatement();
Stringsql="select*fromsdb_upcase_field";
ResultSetrs=stmt.executeQuery(sql);
booleanisHeaderPrint=false;
while(rs.next()){
ResultSetMetaDatamd=rs.getMetaData();
intcol_num=md.getColumnCount();
if(isHeaderPrint){
for(inti=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();
}
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐