
PostgreSQL使用jdbc_fdw连接HANA数据库
前言
HANA数据库拥有完整的客户端连接库,基本上外边广泛用到的,它也都有。比如:odbc, jdbc, ado.net, nodejs, go, ruby等。它还有自己专用的mdx。如下图所示。但是有一个不方便的地方,你得上他的官网上去下载这里边的大多数driver。

唯独jdbc驱动,还算便利,我们可以从maven公有仓库中拿到。
<dependency>
<groupId>com.sap.cloud.db.jdbc</groupId>
<artifactId>ngdbc</artifactId>
<version>2.19.16</version>
<type>pom</type>
</dependency>
或者如果能访问到SAP内网:
https://int.repositories.cloud.sap/ui/native/build-releases/com/sap/cloud/db/jdbc/ngdbc/2.19.16/
这里也可以获取它的驱动。
本文接着以前的一篇文章:PostgreSQL外部表插件jdbc_fdw使用体验,继续介绍使用jdbc_fdw连接到HANA数据库的使用方法。
jdbc_fdw连接HANA
2.1 jdbc_fdw编译安装
略,这个可以参考上边的那篇文章。略补充说明的是:
ln -s /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.362.b09-2.el8_7.x86_64/jre/lib/amd64/server/libjvm.so /usr/lib64/libjvm.so
这一步必不可少。因为链接的路径里头/usr/lib64是硬编码的。
为方便使用,最好将JAVA_HOME, LD_LIBRARY_PATH也都设上。
export JAVA_HOME=/usr/local/sapjvm_8
export PATH=$PATH:$JAVA_HOME/bin
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$JAVA_HOME/jre/lib/amd64/server:$JAVA_HOME/jre/lib/amd6
2.2 清除旧环境
mydb=# drop user MAPPING FOR postgres SERVER jdbc_hana;
DROP USER MAPPING
mydb=# drop server jdbc_hana;
DROP SERVER
2.3 授权
PG下边的有一个普通库:mydb,以及普通用户mydb,它拥有访问mydb的所有权限。但是需要对他进行必要的授权:
mydb=# \dx
List of installed extensions
Name | Version | Schema | Description
----------+---------+------------+-------------------------------------------------------------
jdbc_fdw | 1.2 | public | foreign-data wrapper for remote servers available over JDBC
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
mydb=# \c
psql (14.10, server 14.3)
You are now connected to database "mydb" as user "postgres".
mydb=# grant ALL on FOREIGN data wrapper jdbc_fdw to mydb;
GRANT
2.4 创建server及user mapping
mydb=# \c mydb Postgres
psql (14.10, server 14.3)
You are now connected to database "mydb" as user "Postgres".
mydb=> CREATE SERVER jdbc_hana FOREIGN DATA WRAPPER jdbc_fdw OPTIONS(
mydb(> drivername 'com.sap.db.jdbc.Driver',
mydb(> url 'jdbc:sap://35.x.x.x:30215',
mydb(> querytimeout '10s',
mydb(> jarfile '/iihero/plugins/fdw/ngdbc-2.19.16.jar',
mydb(> maxheapsize '256MB'
mydb(> );
CREATE SERVER
mydb=> CREATE USER MAPPING FOR mydb SERVER jdbc_hana OPTIONS (username 'user',password 'xxxxxxx');
CREATE USER MAPPING
2.5 源库HANA上建表,初始化数据
这个可以用DBEaver等工具完成。
CREATE TABLE t(id int PRIMARY KEY, col2 varchar(32));
INSERT INTO t values(1, 'wang');
UPDATE t SET col2 = 'wang_updated' WHERE id = 1;
SELECT * FROM t;
2.6 PG端完成foreign table的创建
CREATE FOREIGN TABLE t (id int options(key 'true'), col2 varchar(32)) SERVER jdbc_hana; // 1
可与下边的进行对比。
CREATE FOREIGN TABLE t (id int, col2 varchar(32)) SERVER jdbc_hana; // 2
针对语句1,因为有key的定义,所以,可以进行正常的CUD操作。
针对语句2,在cud时,会出现下边的错误提示:
mydb=# delete from t;
ERROR: no primary key column specified for foreign table
DETAIL: For UPDATE or DELETE, at least one foreign table column must be marked as primary key column.
HINT: Set the option "key" on the columns that belong to the primary key.
针对语句1, 可以借用pg的语法,一次生成大量的(随机)数据。哈哈,这也不失为一种方法。随然速度有点慢,但是毕竟功能很强大。
mydb=# delete from t;
DELETE 1
mydb=# insert into t select n, 'test' || n from generate_series(1, 10000) as n;
INSERT 0 10000
mydb=# select * from t order by id desc limit 1;
id | col2
-------+-----------
10000 | test10000
(1 row)
这个实验,唯一失败的地方是,当尝试使用普通用户:mydb创建上边的外部表进行访问时,会出现下边的错:
mydb=# \c mydb mydb
psql (14.10, server 14.3)
... ...
mydb=> select * from t;
ERROR: password is required
DETAIL: Non-superuser cannot connect if the server does not request a password.
HINT: Target server's authentication method must be changed.
这个问题好像有人报了:https://github.com/pgspider/jdbc_fdw/issues/15
最大的体会是,可能充分利用PG现有的超强的语法,做很多有意思的事情。
参考
[1] https://mp.weixin.qq.com/s/-QR9FgxUTiPUnUyaoZvYVg

文章转载自数据库杂记,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




