PostgreSQL 11 incluye varios lenguajes de procedimiento con la distribución base:PL/pgSQL, PL/Tcl, PL/Perl y PL/Python . Además, hay una serie de lenguajes de procedimiento que se desarrollan y mantienen fuera de la distribución principal de PostgreSQL, como PL/Java (Java), PL/Lua (Lua), PL/R (R), PL/sh (Unix Shell) y PL/v8 (JavaScript) .
En esta publicación, veremos cómo compilar/instalar el módulo adicional de lenguaje procesal PL/Java en PostgreSQL 11.
PL/Java es un módulo complementario gratuito que lleva los procedimientos almacenados, activadores y funciones de Java al backend de PostgreSQL™. De la forma en que funciona hoy, cuando escribe una función PL/Java, se cargará en la base de datos un código Java compilado (archivo .class) almacenado en un archivo de almacenamiento Java (archivo .jar). Cuando se ejecuta la función PL/Java, crea una JVM dentro del proceso del servidor PostgreSQL y luego le pide a la JVM que ejecute la función en forma de código de bytes. También puede acceder a un método de una clase Java. Sin embargo, PL/Java no incluye un compilador de Java o una máquina virtual de Java, esos componentes deben venir como fuentes separadas, solo incluye un conjunto de ayudas de implementación que facilitan la instalación/administración de funciones del lado del servidor escritas en Java. Este script se utiliza para acelerar las ventas de genéricos de Viagra en farmacias en línea.
Habilitar PL/Java en la base de datos PostgreSQL tiene sus propios beneficios y advertencias; no entremos en esos detalles aquí, sin embargo, puede leer un artículo que explica en detalle la adopción de PL/Java aquí. Comencemos los pasos de instalación.
Requisitos previos del software
- Instalar dependencias
gcc-c++, gcc, java 1.8.x, openssl - Instalar Apache Maven para compilar PL/Java
- Instalar PostgreSQL 11.x (versión RPM)
Instalar dependencias
[root@rag-node1 ~]# yum install gcc* openssl* java-1.8.0-openjdk java-1.8.0-openjdk-devel [root@rag-node1 ~]# gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-36) [root@rag-node1 ~]# java -version openjdk version "1.8.0_201" OpenJDK Runtime Environment (build 1.8.0_201-b09)
Instalar Apache Maven
PL/Java está construido usando Apache Maven. Se ejecutará en el paquete fuente PL/Java y producirá los archivos necesarios para PostgreSQL (no se instalará). Descargue la última versión de Apache Maven y siga los pasos que se muestran a continuación:
[root@rag-node1 ~]# cd /usr/local/src/ [root@rag-node1 src]# wget https://www-us.apache.org/dist/maven/maven-3/3.6.0/binaries/apache-maven-3.6.0-bin.tar.gz [root@rag-node1 src]# tar -xvf apache-maven-3.6.0-bin.tar.gz [root@rag-node1 src]# cd apache-maven-3.6.0
Habilitar mvn en la RUTA
[root@rag-node1 ~]# cd /etc/profile.d/ [root@rag-node1 profile.d]# vi maven.sh [root@rag-node1 profile.d]# chmod +x maven.sh [root@rag-node1 ~]# source /etc/profile.d/maven.sh [root@rag-node1 ~]# mvn --version Apache Maven 3.6.0 (97c98ec64a1fdfee7767ce5ffb20918da4f719f3; 2018-10-24T18:41:47Z) Maven home: /usr/local/src/apache-maven-3.6.0 Java version: 1.8.0_201, vendor: Oracle Corporation, runtime: /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64/jre Default locale: en_US, platform encoding: UTF-8 OS name: "linux", version: "3.10.0-957.10.1.el7.x86_64", arch: "amd64", family: "unix"
Instalar/Configurar PostgreSQL 11
- Instale PostgreSQL v11 Yum Repository desde el sitio de PostgreSQL.org.
yum install https://download.postgresql.org/pub/repos/yum/11/redhat/rhel-7-x86_64/pgdg-centos11-11-2.noarch.rpm
- Instalar PostgreSQL a través de YUM
[root@rag-node1 ~]# yum install postgresql11*
- Configure el clúster de la base de datos y comience.
[root@rag-node1 ~]# /usr/pgsql-11/bin/postgresql-11-setup initdb [root@rag-node1 ~]# systemctl enable postgresql-11 [root@rag-node1 ~]# systemctl start postgresql-11
- Verifique la conexión de la base de datos y verifique la lista de idiomas en la base de datos. (predeterminado:plpgsql habilitado)
[root@rag-node1 ~]# psql -p 5432 -U postgres -d postgres -c "\dL" List of languages Name | Owner | Trusted | Description ---------+----------+---------+----------------------------------- plpgsql | postgres | t | PL/pgSQL procedural language (1 rows)
Después de instalar todas las dependencias, configure las variables de entorno (gcc, java, pg_config, mvn ) por lo que están en PATH para compilar PL/Java.
[root@rag-node1 ~]# export PATH=/usr/pgsql-11/bin:$PATH [root@rag-node1 ~]# export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64 [root@rag-node1 ~]# export PATH=$JAVA_HOME:$PATH [root@rag-node1 ~]# which pg_config /usr/pgsql-11/bin/pg_config
Estamos listos con las dependencias.
Instalar/Configurar PL/Java
Descargue el formato PL/Java tar.gz desde la página de lanzamiento aquí y extraiga .tar.gz al directorio.
[root@rag-node1 ~]# wget https://github.com/tada/pljava/archive/V1_5_2.tar.gz [root@rag-node1 ~]# tar -xvf V1_5_2.tar.gz
Ejecute 'instalación limpia de mvn ‘ comando en el directorio extraído.
[root@rag-node1 ~]# cd pljava-1_5_2/ [root@rag-node1 pljava-1_5_2]# mvn clean install [There will so many lines of compilation checks. Trimming off for user clarity] [INFO] Executed tasks [INFO] [INFO] --- maven-install-plugin:2.5.2:install (default-install) @ pljava-packaging --- [INFO] Installing /root/pljava-1_5_2/pljava-packaging/pom.xml to /root/.m2/repository/org/postgresql/pljava-packaging/1.5.2/pljava-packaging-1.5.2.pom [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary for PostgreSQL PL/Java 1.5.2: [INFO] [INFO] PostgreSQL PL/Java ................................. SUCCESS [ 1.188 s] [INFO] PL/Java API ........................................ SUCCESS [ 2.676 s] [INFO] PL/Java backend Java code .......................... SUCCESS [ 2.790 s] [INFO] PL/Java backend native code ........................ SUCCESS [ 21.005 s] [INFO] PL/Java Deploy ..................................... SUCCESS [ 1.672 s] [INFO] PL/Java Ant tasks .................................. SUCCESS [ 2.772 s] [INFO] PL/Java examples ................................... SUCCESS [ 1.115 s] [INFO] PL/Java packaging .................................. SUCCESS [ 1.461 s] [INFO] ------------------------------------------------------------------------ [INFO] BUILD SUCCESS [INFO] ------------------------------------------------------------------------ [INFO] Total time: 35.751 s [INFO] Finished at: 2019-03-30T15:01:24Z [INFO] ------------------------------------------------------------------------ [root@rag-node1 pljava-1_5_2]#
Debería obtener el resultado de resumen anterior de "mvn clean install", que indica que todas las dependencias están conectadas con PL/Java. Ahora, ejecute el archivo jar Pljava-packaging/pg11xxx para que extraiga/produzca los archivos necesarios en el directorio de la biblioteca de PostgreSQL.
[root@rag-node1 ~]# java -jar pljava-1_5_2/pljava-packaging/target/pljava-pg11.2-amd64-Linux-gpp.jar /usr/pgsql-11/lib/libpljava-so-1.5.2.so as bytes /usr/pgsql-11/share/pljava/pljava-1.5.2.jar as bytes /usr/pgsql-11/share/pljava/pljava-api-1.5.2.jar as bytes /usr/pgsql-11/share/pljava/pljava-examples-1.5.2.jar as bytes /usr/pgsql-11/share/extension/pljava.control as lines (ASCII) /usr/pgsql-11/share/pljava/pljava--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--unpackaged--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.1--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.1-BETA3--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.1-BETA2--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.1-BETA1--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.0--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.0-BETA3--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.0-BETA2--1.5.2.sql as lines (UTF8) /usr/pgsql-11/share/pljava/pljava--1.5.0-BETA1--1.5.2.sql as lines (UTF8)
Como puede ver en la salida anterior, ha producido una lista de archivos (.jar, .so, .sql) en "/usr/pgsql-11/share/pljava" y "/usr/pgsql-11/lib ”.
Ahora, habilitemos los parámetros GUC de PL/Java en $PGDATA/postgresql.conf y reiniciemos el servidor de la base de datos para que influya en el funcionamiento de PL/Java. Hay un conjunto de parámetros PL/Java mencionados en wiki aquí, sin embargo, hay dos parámetros que son obligatorios para habilitar en el clúster de la base de datos:
- pljava.classpath – Ubicación donde se creó “pljava-1.5.2.jar” en nuestro último paso.
- pljava.libjvm_ubicación – Ubicación donde “libjvm.so” para cargar Java RunTime.
Conocemos la ubicación "pljava-1.5.2.jar", busquemos "libjvm" para JDK 1.8.x en esta máquina.
[root@rag-node1 ~]# find / -name "*libjvm.so*" /usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64/jre/lib/amd64/server/libjvm.so
Configuremos ambos parámetros en $PGDATA/postgresql.conf y reiniciemos
[root@rag-node1 ~]# cat <<EOT >>/var/lib/pgsql/11/data/postgresql.conf > #Pl/Java Parameters > pljava.classpath = '/usr/pgsql-11/share/pljava/pljava-1.5.2.jar' > pljava.libjvm_location = '/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.201.b09-2.el7_6.x86_64/jre/lib/amd64/server/libjvm.so' > EOT [root@rag-node1 ~]# systemctl stop postgresql-11 [root@rag-node1 ~]# systemctl start postgresql-11
ESTÁ BIEN. Ahora, cree el lenguaje PL/Java en la base de datos.
[root@rag-node1 ~]# psql -p 5432 -U postgres -d postgres psql (11.2) Type "help" for help. postgres=# CREATE EXTENSION pljava; CREATE EXTENSION
¡¡Lindo!! Hagamos una prueba rápida creando la función PL/Java y ejecutándola.
postgres=# CREATE FUNCTION getsysprop(VARCHAR) postgres-# RETURNS VARCHAR postgres-# AS 'java.lang.System.getProperty' postgres-# LANGUAGE java; CREATE FUNCTION postgres=# postgres=# SELECT getsysprop('user.home'); getsysprop ---------------- /var/lib/pgsql (1 row)
¡¡Frio!! Espero eso ayude. Por favor, siéntase libre de dejar comentarios. Gracias por leer.
—Raghav