PL/Java

PL/Java 是 Unvdb的 Java 语言扩展,允许你直接在数据库中用 Java 编写函数、触发器和过程。

基本安装与配置

1. Unvdb-TX 配置

确保 unvdbsvr.conf 配置如下(根据实际路径修改):

shared_preload_libraries = pljava
pljava.libjvm_location = '/usr/lib/jvm/java-11-openjdk/lib/server/libjvm.so'#改为实际java路径

2. 安装 PL/Java 扩展

扩展注册

CREATE EXTENSION pljava;

插件参数说明

参数名 类型 默认值 说明
pljava.allow_unenforced list 空列表 在 “无策略执行” 模式下,允许的语言名称(如 javau, java)。:contentReference[oaicite:3]{index=3}
pljava.allow_unenforced_udt bool off 同上,但针对 UDT(用户自定义类型)的转换。:contentReference[oaicite:4]{index=4}
pljava.debug bool off 启动调试模式,进入 JVM 前暂停,以便连接调试器。:contentReference[oaicite:5]{index=5}
pljava.enable bool on 控制 PL/Java 初始化是否继续执行,可用于调试。:contentReference[oaicite:6]{index=6}
pljava.implementors list [postgresql] 设置部署描述中认可的 implementor 名称(JAR 内)。:contentReference[oaicite:7]{index=7}
pljava.java_thread_pg_entry enum allow 控制 Java 线程访问 PG 的策略:allow/error/block/throw。:contentReference[oaicite:8]{index=8}
pljava.libjvm_location string 指定 libjvm.so/dll/dylib 的绝对路径,用于加载 JVM。:contentReference[oaicite:9]{index=9}
pljava.module_path string 自动计算 Java 模块路径,一般由两个 Jar 构成,必要时可自定义。:contentReference[oaicite:10]{index=10}
pljava.policy_urls list ["file:${org.postgresql.sysconfdir}/pljava.policy","="] Java 安全策略文件 URL 列表,用于安全模式执行。:contentReference[oaicite:11]{index=11}
pljava.release_lingering_savepoints bool off 是否在函数返回时释放未处理的 savepoints。:contentReference[oaicite:12]{index=12}
pljava.statement_cache_size int 默认值未显式给出,通常是几十至几百 JDBC 已准备语句的 MRU 缓存大小。:contentReference[oaicite:13]{index=13}
pljava.vmoptions string JVM 启动参数,如 -Xmx256m--add-modules。:contentReference[oaicite:14]{index=14}

示例

a. 写 Java 类:

demo/Hello.java

package demo;
public class Hello {
    public static String greet(String name) {
        return "Hello from Java, " + name + "!";
    }
}

编译打包:

javac -d . Hello.java
jar cf hello.jar demo/Hello.class

b. 安装 jar 到数据库:

SELECT sqlj.install_jar('file:///your/absolute/path/hello.jar', 'hello_jar', true);

c. 注册函数:

CREATE FUNCTION hello_java(text)
RETURNS text
AS 'demo.Hello.greet'
LANGUAGE java;

d. 调用测试:

SELECT hello_java('unvdb');  -- 应输出 Hello from Java, unvdb!