暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PostgreSQL使用jdbc_fdw连接HANA数据库

数据库杂记 2023-12-24
219

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 DELETEat 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.10server 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进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论