Статьи

Установка PostgreSQL PL / Java в качестве расширения PostgreSQL

В 2011 году я написал серию статей о PostgreSQL PL / Java . Основная информация по-прежнему достоверна, но теперь существует гораздо более простой способ установки PL / Java из исходных текстов. Это также устраняет необходимость зависеть от третьих сторон при создании пакетов. Эти заметки будут довольно краткими, так как я предполагаю, что мои читатели уже знакомы с git и maven.

(Примечание: я передал эту информацию команде PL / Java, поэтому она может быть обработана к тому времени, когда вы ее прочитаете.)

Выполнить базовую сборку

  1. Клонируйте репозиторий PL / Java по адресу https://github.com/tada/pljava .
  2. Беги мавен не делай.
  3. Прибыль!

Конечно, не все так просто. Maven может извлекать свои собственные зависимости, но нам все еще нужно несколько специализированных библиотек, выходящих за рамки стандартного набора инструментов GNU. В моей системе Ubuntu мне нужно было:

  • PostgreSQL-сервер DEV-9,4
  • libpg-DEV
  • libpgtypes3
  • libecpg-DEV

(Я не знаю соответствующих имен пакетов для RedHat / Fedora / CentOS.)

Это может занять немного экспериментов, но не должно быть слишком сложно определить все пакеты, которые вам нужны. Просто помните, что вам обычно нужны пакеты с расширением «-dev».

Существует большое количество предупреждений и ошибок компилятора, но большинство, если не все, похоже, связаны с преобразованием знаков. Это требует дальнейшего расследования — предупреждения о преобразовании знаков указывают на возможные поверхности атаки со стороны злоумышленников — но на данный момент у нас все будет хорошо, пока maven будет успешным. Нам нужны три файла:

1
2
3
./src/sql/install.sql
./pljava/target/pljava-0.0.2-SNAPSHOT.jar
./pljava-so/target/nar/pljava-so-0.0.2-SNAPSHOT-i386-Linux-gpp-shared/lib/i386-Linux-gpp/shared/libpljava-so-0.0.2-SNAPSHOT.so

Копирование файлов

Теперь мы можем скопировать три файла в их соответствующие местоположения.

1
2
3
4
5
6
$ sudo cp ./pljava-so/target/nar/pljava-so-0.0.2-SNAPSHOT-i386-Linux-gpp-shared/lib/i386-Linux-gpp/shared/libpljava-so-0.0.2-SNAPSHOT.so \
  /usr/lib/postgresql/9.4/lib/pljava.so
 
$ sudo cp ./pljava/target/pljava-0.0.2-SNAPSHOT.jar /usr/share/postgresql/9.4/extension/pljava--1.4.4.jar
 
$ sudo cp ./src/sql/install.sql /usr/share/postgresql/9.4/extension/pljava--1.4.4.sql

Мы можем узнать правильный целевой каталог с помощью команды ‘pg_config’.

1
2
3
4
$ pg_config
PKGLIBDIR = /usr/lib/postgresql/9.4/lib
SHAREDIR = /usr/share/postgresql/9.4
...

Я изменил версию с 0.0.2-SNAPSHOT на 1.4.4, так как мы хотим захватить версию PL / Java, а не версию pom.xml. Я надеюсь, что скоро они будут синхронизированы.

Редактирование pljava – 1.4.4.sql

Нам нужно добавить две строки для установки sql:

1
2
SET PLJAVA.CLASSPATH='/usr/share/postgresql/9.4/extension/pljava--1.4.4.jar';
SET PLJAVA.VMOPTIONS='-Xms64M -Xmx128M';

Важно помнить, что для каждого соединения с базой данных создается уникальная JVM. Потребление памяти может стать серьезной проблемой, если у вас более 20 одновременных подключений.

Создайте файл pljava.control

Мы должны сообщить PostgreSQL о новом расширении. Это обрабатывается контрольным файлом.

/usr/share/postgresql/9.4/extension/pljava.control

1
2
3
4
# pljava extension
comment = 'PL/Java bundled as an extension'
default_version = '1.4.4'
relocatable = false

Сделайте libjvm.so видимым

Обычно мы указываем расположение двоичных файлов java и разделяемых библиотек через переменную среды JAVA_HOME. Это не вариант с сервером базы данных.

Существует два подхода в зависимости от того, хотите ли вы сделать общую библиотеку Java (libjvm.so) видимой для всех приложений или только для сервера базы данных. Я думаю, что первое проще всего.

Нам нужно создать один файл

/etc/ld.so.conf.d/i386-linux-java.conf

1
/usr/lib/jvm/java-8-openjdk-i386/jre/lib/i386/server

где большая часть пути происходит от JAVA_HOME. Местоположение может отличаться в вашей системе. Каталог должен содержать общую библиотеку ‘libjvm.so’.

Мы также должны сказать системе обновить свой кеш.

1
2
3
4
$ sudo ldconfig
$ sudo ldconfig -p | grep jvm
    libjvm.so (libc6) => /usr/lib/jvm/java-8-openjdk-i386/jre/lib/i386/server/libjvm.so
    libjsig.so (libc6) => /usr/lib/jvm/java-8-openjdk-i386/jre/lib/i386/server/libjsig.so

Загрузка расширения

Теперь мы можем легко загружать и выгружать PL / Java.

1
2
3
4
5
=> CREATE EXTENSION pljava;
CREATE EXTENSION
 
=> DROP EXTENSION pljava;
DROP EXTENSION

В случае облезлости …

Если система кажется некорректной, вы можете переместить две команды set в файл postgresql.conf.

/etc/postgresql/9.4/main/postgresql.conf

1
2
3
4
5
6
7
8
#------------------------------------------------------------------------------
# CUSTOMIZED OPTIONS
#------------------------------------------------------------------------------
 
# Add settings for extensions here
 
PLJAVA.CLASSPATH='/usr/share/postgresql/9.4/extension/pljava--1.4.4.jar'
PLJAVA.VMOPTIONS='-Xms64M -Xmx128M'