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

greenplum pl/java

原创 布衣&凡尘 2022-07-14
846

pl/java简介

来自官方文档:
https://www.bookstack.cn/read/greenplum-admin_guide-6.0-zh/96be923df290884c.md
使用Greenplum Database PL/Java扩展,可以将包含这些方法的JAR文件安装到Greenplum数据库中。
Greenplum Database PL/Java 软件包基于开源 PL/Java 1.5.0。
Greenplum Database PL/Java 提供了以下功能。

  1. 能够使用 Java 8 或 Java 11 执行 PL/Java 函数。
  2. 能够指定 Java 运行时。
  3. 标准化实用程序(以 SQL 2003 提案为蓝本)用于在数据库中安装和维护 Java 代码。
  4. 参数和结果的标准化映射。支持复杂类型和集合。
  5. 一个嵌入式高性能 JDBC 驱动程序,利用内部 Greenplum 数据库 SPI 例程。
  6. 对 JDBC 驱动程序的元数据支持。两者都包括在内。DatabaseMetaDataResultSetMetaData
  7. 从查询返回 ResultSet 的功能,作为逐行生成 ResultSet 的替代方法。
  8. 完全支持保存点和异常处理。
  9. 能够使用 IN、INOUT 和 OUT 参数。
  10. 两种独立的 Greenplum 数据库语言:
  11. pljava, TRUSTED PL/Java language
  12. pljavau, UNTRUSTED PL/Java language
  13. 事务和 Savepoint 侦听器,用于在提交或回滚事务或保存点时执行代码。
  14. 在选定的平台上与 GNU GCJ 集成。

SQL 中的函数将在 Java 类中指定一个静态方法。为了执行函数,指定的类必须在 Greenplum 数据库服务器配置参数 指定的类路径上可用。PL/Java 扩展添加了一组函数,可帮助安装和维护 java 类。类存储在普通的Java归档,JAR文件中。JAR 文件可以选择包含部署描述符,而部署描述符又包含部署或取消部署 JAR 时要执行的 SQL 命令。这些函数是根据为 SQL 2003 提出的标准建模的。pljava_classpath

PL/Java 实现了一种传递参数和返回值的标准化方式。复杂类型和集合使用标准 JDBC ResultSet 类进行传递。

PL/Java 中包含一个 JDBC 驱动程序。此驱动程序调用绿点数据库内部 SPI 例程。驱动程序是必不可少的,因为函数通常会回调数据库以提取数据。当 PL/Java 函数获取数据时,它们必须使用与进入 PL/Java 执行上下文的主函数相同的事务边界。

PL/Java 针对性能进行了优化。Java 虚拟机在与后端相同的进程中执行,以最大程度地减少调用开销。PL/Java 的设计目标是将 Java 的强大功能用于数据库本身,以便数据库密集型业务逻辑可以尽可能接近实际数据地执行。

在后端和 Java VM 之间桥接调用时使用标准的 Java 本机接口 (JNI)。

一、安装 java jdk 1.8版本

[root@gp_master~]# yum install java-1.8.0-openjdk* [root@gp_master~]# rpm -qa | grep openjdk java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64 java-1.8.0-openjdk-headless-1.8.0.332.b09-1.el7_9.x86_64 java-1.8.0-openjdk-devel-1.8.0.332.b09-1.el7_9.x86_64 [root@gp_master~]# java -version openjdk version "1.8.0_332" OpenJDK Runtime Environment (build 1.8.0_332-b09) OpenJDK 64-Bit Server VM (build 25.332-b09, mixed mode)

二、安装 PL/Java

1、查看java 安装目录:适用于yum 安装java

[root@gp_master]# which java
/bin/java
[root@gp_master]# ls -lr /bin/java
lrwxrwxrwx 1 root root 22 7月  11 15:24 /bin/java -> /etc/alternatives/java
[root@gp_master]# ls -lrt /etc/alternatives/java
lrwxrwxrwx 1 root root 73 7月  11 15:24 /etc/alternatives/java -> /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64/jre/bin/java

2、greenplum_path.sh 脚本设置环境变量

  其它节点也需要同步设置

  1. 增加JAVA_HOMELD_LIBRARY_PATH变量
  2. $MASTER_DATA_DIRECTORY 设置
  3. $GPHOME 设置
[gpadmin@gp_master~]$vim /usr/local/greenplum-db-6.4.0/greenplum_path.sh
GPHOME=/usr/local/greenplum-db-6.4.0

# Replace with symlink path if it is present and correct
if [ -h ${GPHOME}/../greenplum-db ]; then
    GPHOME_BY_SYMLINK=`(cd ${GPHOME}/../greenplum-db/ && pwd -P)`
    if [ x"${GPHOME_BY_SYMLINK}" = x"${GPHOME}" ]; then
        GPHOME=`(cd ${GPHOME}/../greenplum-db/ && pwd -L)`/.
    fi
    unset GPHOME_BY_SYMLINK
fi
#setup PYTHONHOME
if [ -x $GPHOME/ext/python/bin/python ]; then
    PYTHONHOME="$GPHOME/ext/python"
    export PYTHONHOME
fi
PYTHONPATH=$GPHOME/lib/python
PATH=$GPHOME/bin:$PYTHONHOME/bin:$PATH
LD_LIBRARY_PATH=$GPHOME/lib:$PYTHONHOME/lib:${LD_LIBRARY_PATH-}
export LD_LIBRARY_PATH
if [ -e $GPHOME/etc/openssl.cnf ]; then
OPENSSL_CONF=$GPHOME/etc/openssl.cnf
export OPENSSL_CONF
fi
export GPHOME
export PATH
export PYTHONPATH
#增加JAVA_HOMELD_LIBRARY_PATH
export JAVA_HOMELD_LIBRARY_PATH=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
#增加:MASTER_DATA_DIRECTORY
export MASTER_DATA_DIRECTORY=/u05/master/gpseg-1
[gpadmin@gp_master~]$ source /usr/local/greenplum-db/greenplum_path.sh

3、安装 Greenplum PL/Java 扩展

  在安装 PL/Java 扩展之前,请确保您的 Greenplum 数据库正在运行
  下载 VMware Tanzu™ Greenplum® — VMware Tanzu Network (pivotal.io)
  https://network.pivotal.io/products/vmware-tanzu-greenplum#/releases/242342/file_groups/1255
  greenplum 为6.4版本,对应下载:pljava-2.0.2-gp6-rhel7_x86_64.gppkg
  《pljava.rar》墨天轮资源下载:https://www.modb.pro/download/672870
  通过运行该命令安装软件扩展包。此示例在 Linux 系统上安装 PL/Java 扩展包

[gpadmin@gp_master~]$ gppkg  -i pljava-2.0.2-gp6-rhel7_x86_64.gppkg 
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Starting gppkg with args: -i pljava-2.0.2-gp6-rhel7_x86_64.gppkg
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Installing package pljava-2.0.2-gp6-rhel7_x86_64.gppkg
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-6.4.0/.tmp/pljava-2.0.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-6.4.0/share/packages/database --prefix /usr/local/greenplum-db-6.4.0'
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Installing pljava-2.0.2-gp6-rhel7_x86_64.gppkg locally
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Validating rpm installation cmdStr='rpm --test -i /usr/local/greenplum-db-6.4.0/.tmp/pljava-2.0.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-6.4.0/share/packages/database --prefix /usr/local/greenplum-db-6.4.0'
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Installing rpms cmdStr='rpm -i /usr/local/greenplum-db-6.4.0/.tmp/pljava-2.0.0-0.x86_64.rpm --dbpath /usr/local/greenplum-db-6.4.0/share/packages/database --prefix=/usr/local/greenplum-db-6.4.0'
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Completed local installation of pljava-2.0.2-gp6-rhel7_x86_64.gppkg.
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-Please SET JAVA_HOME firstly.
Please source your $GPHOME/greenplum_path.sh file and restart the database.
You can enable pljava by running `CREATE EXTENSION pljava;`
20220712:13:35:49:018820 gppkg:gp_master:gpadmin-[INFO]:-pljava-2.0.2-gp6-rhel7_x86_64.gppkg successfully installed.

  重启数据库

[gpadmin@gp_master~]$ gpstop -r

  通过在使用PL/Java的数据库中运行SQL脚本
  $GPHOME/share/postgresql/pljava/install.sql 来启用 PL/Java。
  脚本 install.sql注册可信的和不可信的PL/Java语言.
  例如,此示例启用 PL/Java 在数据库 mytestdb:

[gpadmin@gp_master~]$ psql -d mytestdb -f $GPHOME/share/postgresql/pljava/install.sql
psql:/usr/local/greenplum-db-6.4.0/share/postgresql/pljava/install.sql:1: ERROR:  Cannot load libjvm.so library, check that it is available in LD_LIBRARY_PATH (Backend.c:239)
DETAIL:  libjvm.so: cannot open shared object file: No such file or directory
psql:/usr/local/greenplum-db-6.4.0/share/postgresql/pljava/install.sql:2: ERROR:  Cannot load libjvm.so library, check that it is available in LD_LIBRARY_PATH (Backend.c:239)
DETAIL:  libjvm.so: cannot open shared object file: No such file or directory
psql:/usr/local/greenplum-db-6.4.0/share/postgresql/pljava/install.sql:3: ERROR:  function java_call_handler() does not exist
psql:/usr/local/greenplum-db-6.4.0/share/postgresql/pljava/install.sql:4: ERROR:  function javau_call_handler() does not exist

  报错原因:没有找到libjvm.so包
  解决:将java的server下的包加载到环境变量中,其它节点也需要配置

[root@gp_master~]# vim .bash_profile 
# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs
JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.332.b09-1.el7_9.x86_64
PATH=$PATH:$HOME/bin:$JAVA_HOME

export PATH
[root@gp_master~]# source .bash_profile 
[root@gp_master~]# echo "$JAVA_HOME/jre/lib/amd64/server" > /etc/ld.so.conf.d/libjdk-1.8.0_191.conf
[root@gp_master~]# ldconfig

  重新加载实例

[gpadmin@gp_master~]$ psql -d mytestdb -f $GPHOME/share/postgresql/pljava/install.sql
CREATE FUNCTION
CREATE FUNCTION
CREATE LANGUAGE
CREATE LANGUAGE

或:

通过执行CREATE EXTENSION命令注册语言,以在数据库中启用PL/Java。 
例如,此命令在testdb数据库中启用PL/Java:
$ psql -d testdb -c 'CREATE EXTENSION pljava;'
Note: 不推荐使用PL/Java install.sql脚本(在以前的版本中用于注册该语言)。

三、调用jar包

1、将 Java 归档文件(JAR 文件)复制到所有 Greenplum 数据库主机上的同一目录中

[gpadmin@gp_master~]$  gpscp -f gpconfigs/hostlist DigestUtil.java SensitiveDataUtil.java =:/usr/local/greenplum-db/lib/postgresql/java/

2、在主文件中设置服务器配置参数。
参数值为冒号 (:)JAR 文件的分隔列表。
注意:如果将 JAR 文件安装在 以外的目录中,则必须指定 JAR 文件的绝对路径。每个 JAR 文件必须位于所有 Greenplum 数据库主机上的同一位置。

[gpadmin@gp_master java]$ gpconfig -c pljava_classpath -v 'DigestUtil.java:SensitiveDataUtil.java'
20220712:15:03:13:023951 gpconfig:bjgs005dw074:gpadmin-[INFO]:-completed successfully with parameters '-c pljava_classpath -v DigestUtil.java:SensitiveDataUtil.java'

3、重新加载文件。

[gpadmin@gp_master~]$ gpstop -u

4、创建函数

postgres=# CREATE FUNCTION getsysprop(VARCHAR) RETURNS VARCHAR
postgres=#   AS 'java.lang.System.getProperty'
postgres=#   LANGUAGE java;
CREATE FUNCTION
-- 调用
postgres=#  SELECT getsysprop('user.home');
  getsysprop   
---------------
 /home/gpadmin

文档下载:

《PL/Java.pdf》文档下载:https://www.modb.pro/doc/70867
《GP的资源队列.pdf》文档下载:https://www.modb.pro/doc/67644
《Greenplum psql客户端免交互执行SQL.pdf》https://www.modb.pro/doc/69806
《Oracle 自动收集统计信息机制》:https://www.modb.pro/db/403670
《Oracle_索引重建—优化索引碎片》:https://www.modb.pro/db/399543
《DBA_TAB_MODIFICATIONS表的刷新策略测试》https://www.modb.pro/db/414692

                    欢迎点赞支持或留言指正错误

最后修改时间:2022-07-14 12:54:54
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论